Ayuda con punteros de tipo char

Iniciado por bsantana, 10 Enero 2016, 19:04 PM

0 Miembros y 1 Visitante están viendo este tema.

bsantana

Quiero asignar a un arreglo de arrays diferentes palabras, sacadas de un archivo de texto, sé que debo utilizar:

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:
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

MAFUS

Haces mal la asignación. Cuándo dices lo siguiente 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.

bsantana

Cita de: MAFUS en 10 Enero 2016, 19:20 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
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!

MAFUS

#3
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: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:
fscanf(lectura, "%s", nombre1);
arregloNombres[i] = calloc(strlen(nombre1) + 1, sizeof(char));
strncpy(arregloNombres[i], nombre1, strlen(nombre1));

bsantana

Solucionado con arreglo de dos dimensiones! gracias

bsantana

Cita de: 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:arregloNombres[10][80];


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


simplemente no cumple la condición, alguna recomendacion?

MAFUS

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.

bsantana

Cita de: 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.

Salió perfect, muchas gracias!