Problema con for y array de cadenas.

Iniciado por jomag, 6 Febrero 2014, 18:04 PM

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

jomag

Hola, tengo el siguiente código en el que quiero meter en la variable request una cadena constante y la cadena de cada uno de los elementos de mi array de cadenas. Para ello itero mediante un for y hago uso de sprintf, el problema es que solo me lo hace una vez, para el primer elemento de mi array. El array ya esta inicializado con cadenas previamente mediante la funcion getcadenas(). Os dejo el código:

char request[45555];
char **probes;
int i;

probes=getcadenas();


for(i=0; i<5;i++){
sprintf(request,"%sConstante", probes[i]);
printf("%s", request);
}


Espero me puedan ayudar :)

jomag

Bueno, pues ya he resuelto el problema :¬¬, me ha costado días pero me he dado cuenta cuando os pido ayuda, la historia se repite. El problema es que solo había reservado espacio para cada columna del array de cadenas, pero no para cada fila. Una vez reservado espacio no hay problema  ;-)

Yoel Alejandro

Bueno, .... no entendí exactamente lo que quieres indicar con el mensaje, pero me imagino (porque también he trabajado con eso y me ha dado dolores de cabeza) que el problema puede estar efectivamente en la asignación de memoria para probes.

No se cómo lo estás haciendo pero si por ejemplo el probes debe ser un array de digamos 10 cadenas, cada una con capacidad para 50 caracteres (más el nulo de terminación), hay que hacer:

Código (cpp) [Seleccionar]

probes = (char **) malloc( 10 * sizeof (char *) );
if ( probes == NULL ) return;      /* comprueba integridad */
for ( i = 0; i < 10; i++ ) {
   probes[i] = (char *) malloc( 51 * sizeof(char) );
   if ( probes[i] == NULL ) return;
}


Es decir, reservas espacio en probes para 10 strings, o sea, 10 punteros a char. Es bueno siempre verificar si malloc pudo asignar efectivamente memoria, probando si el puntero devuelto es distinto a NULL. De lo contrario, la asignación fue fallida y debes salir o reiniciar el programa. [de otro modo se puede producir una "fuga de memoria" y ya empezarás a parecerte a los programadores de Microsoft, jeje  :laugh:]

Luego, en cada elemento del array probes debes colocar un puntero (devuelto por malloc) a una zona de memoria con espacio para 51 elementos de tipo char, es decir, una cadena con espacio para 50 caracteres más el nulo de terminación (no se te olvide el espacio para el nulo). De nuevo, verifica el retorno de malloc después de cada llamada a la misma.

Ahora sí puedes empezar a llenar el array probes con cadenas con (en este caso) 10 cadenas de longitud 50 cada una. En tu caso, si por casualidad los elementos de probes no estaban correctamente inicializados, y eran simplemente punteros NULL, esa es la razón por la que sprintf no escribió nada en request !!
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

jomag

Si eso es lo que decía, lo único que me pasaba es que no había reservado espacio para los punteros a char y si para cada uno de los elementos char, es decir había hecho probes = (char *) malloc( 51 * sizeof(char) ); pero no probes = (char **) malloc( 10 * sizeof (char *) );. Finalmente me di cuenta, de todos modos muchas gracias, no había contemplado la posibilidad de comprobar si malloc da error, y como no me quiero parecer a Microsoft lo haré, muchas gracias! :)