[C con Clase] Ingreso de datos cin

Steven Davidson srd4121 en njit.edu
Mar Nov 22 18:04:07 CET 2011


Hola Luis,

2011/11/22 Luis Gutierrez Gomez <gutierrezgl en hotmail.com>:
>
>
> Gracias por las respuestas. Steven tengo una duda.
>

De nada. Veamos la duda.

> Tu mencionas esto:
>
> .************+
>
> .
>
> .
>
> En cualquier caso, siempre se agrega el carácter nulo al final de la
> cadena. Por ejemplo,
>
> char szNombreCompleto[1024]="";
>
> cin.getline( szNombreCompleto, 1024 );
>
>
>
>
>
> ***********************
>
>
>
> ¿El final de la cadena no sería, char szNombreCompleto [1024 - 1]= "";ya que
>
> szNombreCompleto creo que tiene 1024 miembros? O tiene 1025 miembros char?
>

No; el índice 1023 sería el final del array.

Al hablar de la cadena de caracteres nos referimos a la información
guardada; es decir, a los primeros caracteres que representan la
información, hasta llegar al primer carácter nulo, que indica el final
de la cadena y por tanto de la información. Ahora bien, para
representar una cadena de caracteres en C/C++, hacemos uso de un array
de 'char'. El array puede ser del tamaño que indiquemos al definirlo.
Su contenido es elementos de tipo 'char', que pueden o no formar parte
de la cadnea; es decir, la información. Por ejemplo,

char szCad[10] = "hola";

La cadena es "hola", que ocupa 5 caracteres, porque contiene el
carácter nulo al final. Sin embargo, el array, 'szCad', contiene 10
caracteres. Los otro 5 caracteres restantes no forman parte de la
cadena y no se consideran información. Podemos decir que contiene
"basura". En memoria, tendríamos esto,

Dirección
de Memoria     Tipo      Nombre        Valor           Misceláneo
----------------------------------------------------------------------------------------
0x22EEAA00   char     ----                'h'               ( Nota: szCad[0] )
0x22EEAA01   char     ----                'o'               ( szCad[1] )
0x22EEAA02   char     ----                'l'               ( szCad[2] )
0x22EEAA03   char     ----                'a'               ( szCad[3] )
0x22EEAA04   char     ----                '\0'               ( szCad[4] )
0x22EEAA05   char     ----                '?'               ( szCad[5] )
0x22EEAA06   char     ----                '\n'               ( szCad[6] )
0x22EEAA07   char     ----                '\0'               ( szCad[7] )
0x22EEAA08   char     ----                '7'               ( szCad[8] )
0x22EEAA09   char     ----                '%'               ( szCad[9] )
...

Como puedes ver, la información y lo que nos interesa es la cadena
"hola" que se aloja en los primeros 4 caracteres, y por tanto bytes,
del array 'szCad'; luego sigue el carácter nulo. Posteriormente,
existen cualesquier caracteres que pudiesen estar ahí, pero como no
son caracteres válidos, no forman parte de la cadena.

En cuanto a 'getline()', el ejemplo que escribí es:

cin.getline( szNombreCompleto, 1024 );

Si el usuario escribe, por ejemplo,

Pepe López Jiménez[ENTER]

entonces el canal de entrada estándar, representado por 'cin',
contendrá la siguiente secuencia de caracteres:

Pepe López Jiménez\n

y entonces, el array 'szNombreCompleto' contendrá la cadena "Pepe
López Jiménez", la cual dispone de 19 caracteres más el carácter nulo
que agrega 'getline()'. Esto sucede por el caso #2, ya que se leyó el
carácter separador: '\n'. Los 1004 caracteres posteriores del array
contendrán cualquier cosa que estuviese en memoria cuando se creó el
array, 'szNombreCompleto'; es decir, basura, porque no son caracteres
válidos y por tanto no los usamos.

Por cierto, el canal de entrada estándar quedaría ahora vacío, porque
se extrajeron todos los caracteres del canal - incluyendo el carácter
'\n'.

>
>
> Yo en mi aplicación lo puse asi:
>
>
>
> ;
>
> ;
>
> ;
>
>  cout << "Ingrese " << count + 1 <<"°"<< " Nombre y Teléfono de persona ";
>  cout << endl;
>  cout << " Nombre : " ;
>  cin.getline( Plantilla[count].Nombre , MAX_LETRAS );
>  cout << endl;
>  cout << " Teléfono : ";
>  cin >> Plantilla[count].Telefono;
>
> ;
>
> ;
>
> ;
>
>
>
> /*******************************************************/
>
>
>
> Y sí; funciona como lo indicas; pero donde encajaría el "agregar el caracter nulo";
>
> por favor podrías indicarme la forma como iría en esa parte del programa y para que sirve?
>
>

Vamos a definir la constante 'MAX_LETRAS', así,

const int MAX_LETRAS = 10;

para que veas cómo funciona el caso #1 que mencioné. Digamos que el
usuario escribe:

Pepe López Jiménez[ENTER]

La función 'getline()' leería y extraería hasta MAX_LETRAS-1
caracteres, que es 9. Esto significa que 'Plantilla[count].Nombre'
contendría la cadena "Pepe Lópe\0". La función agrega el carácter nulo
al final de la cadena automáticamente, porque así se construyen las
cadenas en C++; el carácter nulo indica el final de la cadena - de la
información.

El canal de entrada estándar contendría lo siguiente:

z Jiménez\n

que se extraerían en posteriores lecturas de 'cin'.


Espero haber aclarado la duda.

Steven




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