[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