EndOfFile en C – EOF

¿Qué pones para terminar el progtwig, -1, no funciona?

#include  //copy input to output main() { char c; c = getchar(); while(c != EOF) { putchar(c); c = getchar(); } } 

Estoy de acuerdo con todas las demás personas en este hilo diciendo que use int c not char .
Para finalizar el ciclo (al menos en * nix como sistemas), debe presionar Ctrl-D para enviar EOF .

Además, si desea que sus personajes se hagan eco, reescriba su código de esta manera:

 #include int main(void) { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); fflush(stdout); /* optional, instant feedback */ } return 0; } 

Macro: int EOF

Esta macro es un valor entero devuelto por una serie de funciones para indicar una condición de fin de archivo, o alguna otra situación de error. Con la biblioteca GNU, EOF es -1 . En otras bibliotecas, su valor puede ser algún otro número negativo.

La documentación para getchar es que devuelve el siguiente carácter disponible, convertido a un unsigned char y luego devuelto en un valor de retorno int .

El motivo de esto es asegurarse de que todos los caracteres válidos se devuelven como valores positivos y nunca se compararán como iguales a EOF , una macro que se evalúa como un valor entero negativo.

Si coloca el valor de retorno de getchar en un char , entonces, dependiendo de si el char su implementación está firmado o no, puede obtener una detección falsa de EOF , o nunca puede detectar EOF incluso cuando debería.

La señalización de EOF a la biblioteca de C suele ocurrir automáticamente cuando se redirige la entrada de un progtwig desde un archivo o un proceso canalizado. Para hacerlo de forma interactiva, depende de su terminal y shell, pero normalmente en unix se logra con Ctrl-D y con Windows Ctrl-Z en una línea por sí sola.

debes usar int y no char

Si el valor entero devuelto por getchar () se almacena en una variable de tipo char y luego se compara con la constante de enteros EOF, la comparación nunca tendrá éxito, porque la extensión de signo de una variable de tipo char en ensanchamiento a entero está definida por la implementación . – Opengroup estándar POSIX

Si char unsigned está unsigned de forma predeterminada para su comstackdor (o por cualquier otra opción que se esté utilizando para invocar al comstackdor), es probable que

 (c == EOF) 

nunca puede ser verdad Si sizeof(unsigned char) < sizeof( int) , que es casi siempre cierto, entonces la promoción del char a un int nunca dará como resultado un valor negativo, y EOF debe ser un valor negativo.

Esa es una razón por la que todas (o al menos muchas, si no todas) las funciones en el estándar C que tratan o devuelven caracteres especifican int como el parámetro o tipo de retorno.

EOF no es un carácter real o una secuencia de caracteres. EOF denota el final del archivo o flujo de entrada, es decir, la situación en la que getchar() intenta leer un carácter más allá del último.

En Unix, puede cerrar una secuencia de entrada interactiva escribiendo CTRLD. Esa situación hace que getchar() devuelva EOF . Pero si un archivo contiene un carácter cuyo código ASCII es 4 (es decir, CTRLD ), getchar() devolverá 4, no EOF .

Todavía funciona con el tipo de datos char . Pero los trucos están verificando la condición en el bucle con valor int .

Primero: vamos a comprobarlo. si escribes el siguiente código como

 printf("%d",getchar()); 

Y luego, si da la entrada desde el teclado A , debería ver 65, que es el valor ASCII de la A, o si le da CTRLD, entonces vea -1 .

De modo que si implementas esta lógica entonces el código de resolución es

 #include int main() { char c; while ((c = getchar()) != EOF){ putchar(c); //printf("%c",c); // this is another way for output } return 0; } 

hola, creo que se debe a que en una secuencia -1 no es uno sino dos caracteres y el ascii para ninguno de ellos es -1 o lo que sea que se use para EOF