C – EOF中的EndOfFile

你用什么来结束程序,-1,不起作用:

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

我同意这个post中的所有其他人说使用int c而不是char
要结束循环(至少在* nix系统上),您可以按Ctrl-D发送EOF

另外,如果你想让你的角色立即回复,你可以像这样重写你的代码:

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

宏:int EOF

此宏是一个整数值 ,由许多函数返回以指示文件结束条件或某些其他错误情况。 使用GNU库,EOF为-1 。 在其他库中,其值可能是其他一些负数。

getchar的文档是它返回下一个可用字符,强制转换为unsigned char ,然后返回int返回值。

这样做的原因是为了确保所有有效字符都作为正值返回,并且不会与EOF相等,后者是一个评估为负整数值的宏。

如果将getchar的返回值放入char ,那么根据您的实现的char是有符号还是无符号,您可能会得到虚假的EOF检测,或者您可能永远不会检测到EOF

当从文件或管道进程重定向程序的输入时,通常会自动向C库发送信号EOF 。 交互式地取决于您的终端和shell,但通常在unix上,它是通过Ctrl-D和Windows上的Ctrl-Z实现的。

你应该使用int而不是char

如果getchar()返回的整数值存储到char类型的变量中,然后与整数常量EOF进行比较,则比较可能永远不会成功,因为扩展为整数时char类型的变量的符号扩展是实现定义的。 – opengroup POSIX标准

如果默认情况下char对于编译器是unsigned的(或者通过用于调用编译器的任何选项),则可能是

 (c == EOF) 

永远不可能是真的。 如果sizeof(unsigned char) < sizeof( int) (几乎总是如此),那么将char提升为int将永远不会产生负值,并且EOF必须是负值。

这就是为什么C标准中处理或返回字符的所有(或至少很多,如果不是全部)函数都将int指定为参数或返回类型的原因之一。

EOF不是实际字符或字符序列。 EOF表示输入文件或流的结束,即getchar()尝试读取最后一个字符之外的情况。

在Unix上,您可以通过键入CTRLD来关闭交互式输入流。 这种情况导致getchar()返回EOF 。 但是如果文件包含ASCII码为4的字符(即CTRLD ),则getchar()将返回4,而不是EOF

它仍然适用于char数据类型。 但是这些技巧是用int值检查循环中的条件。

首先:让我们检查一下。 如果您编写以下代码,如

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

然后,如果你从键盘A给出输入你应该看到65A的 ASCII值,或者你给CTRLD然后看-1

因此,如果您实现此逻辑,那么解决代码就是

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

嗨,我认为它在流中的becoz -1不是一个而是两个字符,并且它们的ascii都不是-1或者用于EOF的任何东西