[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