En el fragmento de código que se proporciona a continuación. Siempre que estoy ingresando un conjunto de caracteres con ctrl + z al final, lo que debería marcar EOF para getchar (). Está imprimiendo todos los caracteres junto con otro carácter al final que tiene un valor ASCII de 26. No conozco el nombre del carácter.

Espero que el programa termine donde puse ctrl + z. Sin embargo, Ctrl + z solo funciona cuando el flujo de entrada está vacío.

¿Alguien puede explicar por qué está devolviendo un personaje tan extraño en lugar de terminar el programa?

#include<stdio.h>
#include<ctype.h>

int main(){

   int c;

   while((c = getchar()) != EOF)
       putchar(c);

   return 0;
}

Lo siento, no pude subir la imagen, tampoco tengo ninguna forma de mostrar el carácter que tiene ese valor de 26. Los gráficos de la tabla ASCII dicen que 26 es / sustituto /. No sé lo que eso significa. Gracias.

2
Anagh Basak 22 ago. 2020 a las 11:35

1 respuesta

La mejor respuesta

Ctrl + Z es un carácter de control ASCII como Ctrl + A, Ctrl + B, Ctrl + @ y los otros. No es EOF. EOF es distinto de cualquier carácter: de lo contrario, si getchar() devolvió ese valor, no podría saber si había llegado al final del archivo o si había leído ese carácter. Ctrl + Z tiene el valor ASCII 26. Estás viendo lo que escribiste.

En su sistema operativo (Windows, presumiblemente), Ctrl + Z al comienzo de una línea es una indicación para el terminal de que ha terminado de escribir. (Más precisamente, creo que el código está en las funciones de la biblioteca que se leen desde el terminal, y no desde el terminal en sí. Pero puedo estar equivocado en los detalles ya que no soy un experto en Windows). Solo funciona al principio. de una línea porque así es como funciona el código de la biblioteca que se lee desde el terminal. Cuando escribe Ctrl + Z al principio de una línea, getchar() ve una condición de fin de archivo y devuelve EOF.

Cuando escribe Ctrl + Z no al principio de una línea, se trata como un carácter ordinario. Windows lo imprime como un "glifo extraño" que utiliza para indicar un carácter no imprimible.

El significado oficial de la mayoría de los caracteres ASCII se olvidó hace mucho tiempo. Hay un carácter de control ASCII que solía significar "fin de archivo", o más precisamente "fin de transmisión ", que es Ctrl + D, y sobrevive en la familia de sistemas operativos Unix para significar" fin de entrada "cuando se ingresa al principio de una línea en un terminal, al igual que Ctrl + Z en Windows . La asociación de Ctrl + Z con el final del archivo en Windows proviene de una línea histórica de sistemas operativos, principalmente de DEC, en la que se inspiraron DOS y Windows de Microsoft.

No es exactamente la misma pregunta que la tuya, pero recomiendo esta respuesta que debería ayudar a aclarar su confusión acerca de EOF.

1
Gilles 'SO- stop being evil' 22 ago. 2020 a las 09:11