[C con Clase] Punteros y Arrays

Abel oabel5 en yahoo.de
Mie Mar 18 07:39:14 CET 2009


Hola Steven,
gracias por la respuesta rápida.
Probé lo que me indicas pero al hacer lo siguiente:
char (*temp2)[3];
char **temp3;

scanf("%s",temp2[0]);
scanf("%s",temp3[0]);

 me dá error: Unitialized pointer
Algo que tampoco entendí, yo creía que cuando escibo asi:
(*temp2)[3];
creaba un Puntero que apuntaba a un grupo de tres Arrays
y asi:
*temp2[3]
creaba un grupo de Punteros a tres Arrays.

Toda esta problemática viene en realidad de un programa que estoy escribiendo, en donde quiero hacer lo siguiente:

char texto[20]="Hola Amigos &como& estan";
char temp[5][20];
char (*temp2)[20];
char **temp3;

sscanf(texto,"%[^&]&%[^&]&%[^\0]",temp[0],temp[1],temp[2]);//esto funciona
sscanf(texto,"%[^&]&%[^&]&%[^\0]",temp2[0],temp2[1],temp2[2]);//esto no funciona
sscanf(texto,"%[^&]&%[^&]&%[^\0]",temp3,temp3,temp3);//esto no funciona

talvez puedas ayudarme con eso.
Gracias.
Abel




El pasado 2009-03-18 06:11:12, Steven Davidson escribió:
 
SD> Hola Abel,
SD> Abel wrote:
SD> > Hola,
SD> > podría por favor alguien indicarme en que estoy fallando en el
SD> > siguiente código:
SD> > 	char temp1[3][3];
SD> > 	char (*temp2)[3];
SD> > 	char **temp3;
SD> > 	
SD> > 	strcpy(temp1[0],"A");
SD> > 	strcpy(temp2,"B");
SD> 'temp2' es un array de 3 punteros. Deberías acceder a uno de estos 
SD> punteros, como puede ser 'temp2[0]'. Sin embargo, en este esto 
SD> provocaría un error en tiempo de ejecución, ya que un puntero no puede 
SD> guardar información, sino tan sólo la dirección de memoria la cual sí 
SD> contiene información o al menos existe. Tienes dos soluciones:
SD> 1. Adjudica memoria dinámicamente para el puntero, o
SD> 2. Haz que el puntero apunte (valga la redundancia) a memoria ya creada; 
SD> por ejemplo, a otra cadena.
SD> Por ejemplo,
SD> temp2[0] = (char *)malloc( 10 );
SD> strcpy( temp2[0], "B" );
SD> ...
SD> free( temp2[0] );
SD> No te olvides de liberar la memoria previamente creada.
SD> > 	strcpy(temp3[0],"C");
SD> > 	
SD> Aquí, correctamente accedes a la cadena, por lo que los tipos 
SD> concuerdan, pero caes en el mismo error que en el anterior. Debes crear 
SD> memoria dinámicamente. En este caso, debes crear memoria para un puntero 
SD> y luego acceder a cada elemento - cada puntero - y crear memoria para 
SD> cada uno. Por ejemplo,
SD> temp3 = (char **)malloc( 5*sizeof(char*) );  // Creamos 5 punteros
SD> temp3[0] = (char *)malloc( 8 );  // Creamos una cadena de 8 caracteres
SD> strcpy( temp3[0], "C" );
SD> No te olvides de liberar la memoria de cada puntero y después la del 
SD> primer array.
SD> > 	scanf("%c",temp1[0]);
SD> > 	scanf("%c",temp2);
SD> > 	scanf("%c",temp3);
SD> Aquí, tienes un problema de tipos. Estas llamadas deberían ser:
SD> scanf( "%c", temp1[0] );  // o también: &temp1[0][0]
SD> scanf( "%c", &temp2[0][0] );
SD> scanf( "%c", &temp3[0][0] );
SD> Por cierto, estas sentencias indican que quieres guardar un solo 
SD> carácter. No sé si realmente quieres hacer esto, o si querías guardar 
SD> varios caracteres en una cadena. Si esto es así, entonces deberías usar 
SD> el especificador %s. Esto sería,
SD> scanf( "%s", temp1[0] );
SD> scanf( "%s", temp2[0] );
SD> scanf( "%s", temp3[0] );
SD> Espero que esto te aclare las dudas.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase