[C con Clase] Cadenas

Steven R. Davidson vze266ft en verizon.net
Vie Nov 24 07:46:20 CET 2006


Hola Abel,

Ringo wrote:

> Hola a todos,
> esto de las cadenas siempre me traen dolores de cabeza. Podría indicarme 
> alguien por favor porqué el siguiente programa no funciona?:
>  
> int main(int argc, char *argv[])
> {
>    char *a[4];
>    for(int i=0;i<=3;i++){cout<<"Nombre "<<i<<" : ";cin>>a[i];cout<<endl;}
>   
>    for(int i=0;i<=3;i++){gotoxy(10,10+i);cout<<a[i]<<endl;}
>   
>    system("PAUSE"); 
>    return 0;
> }
>  

'a' es un array de punteros a 'char'. Cuando escribes:

cin >> a[i];

Estás accediendo al elemento 'i' del array 'a'. Esto implica que accedes 
a un puntero. Sin embargo, 'a' no fue inicializado y por tanto los 
punteros contienen "basura". Al leer los caracteres desde el teclado, se 
intenta escribir estos caracteres a partir de la dirección de memoria de 
'a[i]', pero como contienen "basura", lo más seguro es que estás 
accediendo a zonas de memoria que no son tuyas.

Lo que debes hacer es crear arrays de 'char' para cada elemento de 'a'. 
Por ejemplo,

a[0] = new char[20];
a[1] = new char[20];
a[2] = new char[20];
a[3] = new char[20];

Ahora podemos usar cada elemento de 'a' para manipular cadenas de 
caracteres. Esto es,

for( int i=0; i<=3; i++ )
{
   cout << "Nombre " << i << " : ";
   cin >> a[i];
   cout << endl;
}

Obviamente, tendrás que liberar la memoria que creaste anteriormente.

En este caso, creo que es mejor crear un array de cadenas estáticas y no 
dinámicas. Por ejemplo,

char a[4][20];

La cuestión es tener memoria válida. En tu programa, no lo tenías, pero 
en los ejemplos anteriores, sí: dinámicamente al usar 'new[]' y 
estáticamente en la declaración de arrays.


Espero haber aclarado la duda.

Steven








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