Author Topic: ¿Cuál es la diferencia entre '\0' y '\n'?  (Read 2967 times)

alfred_oh

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
¿Cuál es la diferencia entre '\0' y '\n'?
« on: Febrero 25, 2014, 04:09:03 pm »
Hola a todos!

Estoy revisando el tema de vectores y en mis apuntes pone que si por ejemplo creo un vector de 5 posiciones y sólo utilizo 4 lo más recomendable es que en la última posición coloque '\0' para que al llamar a printf() se lea todo el vector hasta encontrarse el símbolo '\0' y "no haya sorpresas" en esa ultima posición

           nombre[0]= 'H';
      nombre[1]= 'O';
      nombre[2]= 'L';
      nombre[3]= 'A';
      nombre[4]='\0';
      
      printf("%s\n",nombre); -> hola

Cambiando de situación, para vaciar el buffer de entrada lo que hago es usar: while(getchar()!='\n');

Mi pregunta es cual es la diferencia entre estos dos símbolos porque la impresión que me da es que SIRVEN (NO QUE SEAN LO MISMO) para lo mismo.
Lo que se hasta ahora es que '\n' es el símbolo que representa {ENTER} y entiendo bien (gracias a este foro) el uso que se le da en while(getchar()!='\n'); Sin embargo, me parece que el uso que se le da al símbolo '\0' es muy parecido. ¿Me podrían ayudar porfa? Gracias!

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: ¿Cuál es la diferencia entre '\0' y '\n'?
« Reply #1 on: Febrero 25, 2014, 06:11:05 pm »
Hola:

Un \n es un caracter retorno de carro (creo que es un byte de valor 13). Sirve cuando escribes cadenas para pasar a la siguiente línea en pantalla o cuando lees de teclado, para saber cuando se ha pulsado enter

Un \0 es un byte de valor 0. Sirve internamente a C para saber cuando termina una cadena de texto. Lo utiliza cualquier función de cadenas de C/C++ (printf, strcat, strcpy, .. http://faculty.edcc.edu/paul.bladek/c_string_functions.htm ) para saber cuando termina la cadena y no tener que pasar la longitud de la misma como parametro.

De hecho, en el ejemplo que pones, printf("%s\n", nombre), fíjate que la cadena tiene el \0 para que printf sepa donde termina la cadena y pones adicionalmente un \n para pasar a una nueva línea.

Se bueno.

yoel

  • Newbie
  • *
  • Posts: 7
  • Karma: 0
    • View Profile
Re: ¿Cuál es la diferencia entre '\0' y '\n'?
« Reply #2 on: Marzo 01, 2014, 09:13:49 pm »
Exactamente alfred, como ya explicó mi amigo chuidiang. Las cadenas en C deben estar obligatoriamente terminadas en un nulo '\0', porque ese carácter indica el fin de la cadena. Recuerda que las cadenas ocupan internamente posiciones consecutivas (bytes) de memoria, y de no ser por esta especie de "marca" sería imposible saber dónde termina dicha cadena.

Por otra parte, sucede que funciones como scanf() están programadas para leer los caracteres introducidos por el teclado hasta encontrar el carácter de fin de línea '\n' que desde luego es producido por la tecla ENTER. Ahora bien, fíjate que scanf() lee más no almacena el fin de línea, en su lugar es reemplazado en la cadena por el carácter NULO de terminación (como debe ser). Es decir, si introduces:

h - o - l - a - ENTER

entonces se almacena:

{'h', 'o', 'l', 'a', '\0'}

por lo que el '\n' queda "atorado" en el flujo asociado a la entrada estándar. Por eso es necesario ejecutar getchar() a fin de vaciar dicho flujo. Esto también responde la pregunta de por qué es prudente la instrucción
Code: [Select]
while ( getchar() != '\n' );

Sin embargo queda un pequeño y sutil aspecto que queda por aclarar, y creo lo habías preguntado antes. Si dicha sentencia extrae del  flujo todos los caracteres excepto el fin de línea, ¿cómo es que termina limpiando completamente el flujo, incluyendo el mismo '\n'?

Ello se debe al comportamiento de while. La condición dentro del ciclo while es verificada siempre, y si resulta falsa el ciclo se detiene. Por tanto, al llegar el fin de línea sucede lo siguiente: Se ejecuta getchar(), luego el fin de línea es extraído del flujo, entonces la sentencia getchar() != '\n' es falsa, y se detiene el ciclo.

De todos modos yo creo que este while es innecesario, basta con un simple getchar() puesto que a lo mucho debes leer un único '\n' que termina la línea que es introducida por el teclado.


 

ey