Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bsantana en 10 Enero 2016, 19:04 pm



Título: Ayuda con punteros de tipo char
Publicado por: bsantana en 10 Enero 2016, 19:04 pm
Quiero asignar a un arreglo de arrays diferentes palabras, sacadas de un archivo de texto, sé que debo utilizar:

Código:
const char *arregloNombres[10];

Y mi idea es que el arreglo arroje:

arregloNombres[0]="Esteban"
arregloNombres[1]="Alexis"
etc...

Pero al leer el archivo con los nombres de esta manera:
Código:
fscanf(lectura,"%s %s %d", nombre1,nombre2,&aux);
arregloNombres[i]=nombre1; //i va en aumento

Lo unico que hace es dejarme todas las posiciones del arreglo con el mismo nombre.
¿Como puedo dejar una posicion con un nombre especifico obtenido de un archivo sin que despues se modifique?
Saludos


Título: Re: Ayuda con punteros de tipo char
Publicado por: MAFUS en 10 Enero 2016, 19:20 pm
Haces mal la asignación. Cuándo dices lo siguiente
Código
  1. arregloNombres[i]=nombre1;
lo que haces es copiar a la posición i de arregloNombres la dirección de memoria de nombre1. Todo el array tendrá así esa misma posición y cuando lo muestres con printf todas las posiciones del array te mostrarán el dato que contenga nombre1, que será el último dato que has guardado en él.

Solución:
Usa la función strncpy para realizar una copia por valor de la variable nombre. Acuérdate de que antes de eso debes dimensionar la posición i de arregloNombres para dar cabida al dato.


Título: Re: Ayuda con punteros de tipo char
Publicado por: bsantana en 10 Enero 2016, 19:45 pm
Solución:
Usa la función strncpy para realizar una copia por valor de la variable nombre. Acuérdate de que antes de eso debes dimensionar la posición i de arregloNombres para dar cabida al dato.

Hola gracias por la respuesta, uso la solución que me diste pero al ejecutar se me cae el programa, en el momento que debería salir del ciclo for
Código:
for(i=0;i<cantidadNombres;i++){
        fscanf(archivoLectura, "%s", nombre);
        strncpy(&arregloNombres[i],nombre,9);
    }

    printf("%s",arregloNombres[0]);
Si es algo de asignación de memoria que no hay, soy medio ignorante, espero tu respuesta!


Título: Re: Ayuda con punteros de tipo char
Publicado por: MAFUS en 10 Enero 2016, 20:01 pm
Eso es porqué no has dimensionado la posición i de arregloNombres. Piensa que es solo un puntero y no puedes alojar nada en él.

Puedes resolver eso de dos formas:
Declaras dos dimensiones en arreglonombres:
Código
  1. arregloNombres[10][80];
o dentro del for dimensionas cada posición de arregloNombres de forma dinámica con calloc. Si te decantas por la segunda opción recuerda liberar la memoria asignada por calloc cuándo dejes de usarla.

Dentro del for:
Código
  1. fscanf(lectura, "%s", nombre1);
  2. arregloNombres[i] = calloc(strlen(nombre1) + 1, sizeof(char));
  3. strncpy(arregloNombres[i], nombre1, strlen(nombre1));
  4.  


Título: Re: Ayuda con punteros de tipo char
Publicado por: bsantana en 10 Enero 2016, 20:22 pm
Solucionado con arreglo de dos dimensiones! gracias


Título: Re: Ayuda con punteros de tipo char
Publicado por: bsantana en 10 Enero 2016, 22:45 pm
Eso es porqué no has dimensionado la posición i de arregloNombres. Piensa que es solo un puntero y no puedes alojar nada en él.

Puedes resolver eso de dos formas:
Declaras dos dimensiones en arreglonombres:
Código
  1. arregloNombres[10][80];


Hola denuevo, usé esta solución, pero al querer comparar
Código:
fscanf(lectura,"%s",nombre1);
while(arregloNombres[i]==nombre1)

simplemente no cumple la condición, alguna recomendacion?


Título: Re: Ayuda con punteros de tipo char
Publicado por: MAFUS en 10 Enero 2016, 23:06 pm
C no tiene operadores para comparar cadenas de caracteres, por tanto lo que haces es comparar dos direcciones de memoria. Para ello debes usar la función de librería strcmp.


Título: Re: Ayuda con punteros de tipo char
Publicado por: bsantana en 10 Enero 2016, 23:51 pm
C no tiene operadores para comparar cadenas de caracteres, por tanto lo que haces es comparar dos direcciones de memoria. Para ello debes usar la función de librería strcmp.

Salió perfect, muchas gracias!