[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