你如何看到最后一张照片?换句话说,EOF需要投入什么?我检查了定义,它说EOF是-1。
如果你输入Ctrl-D,你将看不到任何东西。
#include <stdio.h>
int main() {
int c;
while((c = getchar() != EOF)) {
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
答案 0 :(得分:44)
在Linux系统和OS X上,输入以导致EOF的字符是 Ctrl - D 。对于Windows,它是 Ctrl - Z 。
根据操作系统的不同,此字符只有在一行中的第一个字符即 Enter 后的第一个字符时才有效。由于控制台输入通常是面向行的,因此系统可能无法识别EOF字符,直到您使用 Enter 跟进它。
是的,如果该角色被识别为EOF,那么您的程序将永远不会看到实际的角色。相反,C程序将从-1
获得getchar()
。
答案 1 :(得分:27)
您应该将括号更改为
while((c = getchar()) != EOF)
因为“=”运算符的优先级低于“!=”运算符。然后你会得到预期的结果。你的表达式等于
while (c = (getchar()!= EOF))
你得到两个1作为输出,因为你正在进行比较“c!= EOF”。这将始终成为您输入的字符的一个,然后通过点击返回后面的“\ n”。除了最后的比较,其中c确实是EOF,它会给你一个0。
关于EOF的编辑:EOF通常为-1,但标准不保证这一点。该标准仅在7.19.1节中定义了EOF:
EOF扩展为整数 常量表达式,类型为int和 一个负值,由...返回 几个功能来表明 文件结束,即不再输入 来自溪流;
假设EOF等于-1是合理的,但是当使用EOF时,你不应该测试特定的值,而是使用宏。
答案 2 :(得分:7)
EOF的值是一个负整数,以区别于0到255范围内的“char”值。它通常为-1,但它可以是任何其他负数......根据POSIX规范,所以你不应该认为它是-1。
^ D字符是您在UNIX / Linux上的控制台流中键入的字符,用于告诉它逻辑上结束输入流。但在其他情况下(例如,当您从文件中读取时),它只是另一个数据字符。无论哪种方式,^ D字符(意味着输入的结尾)都不会成为应用程序代码。
正如@Bastien所说,如果getchar()
失败,也会返回EOF。严格来说,您应该拨打ferror
或feof
来查看EOF是代表错误还是结束。但在大多数情况下,无论哪种情况,您的应用程序都会做同样的事情。
答案 3 :(得分:4)
EOF表示文件结束。这表示文件已到达,并且不再有数据了。
修改强>
我的立场得到了纠正。在这种情况下,它不是文件的结尾。如上所述,它是在传递CTRL + d(linux)或CTRL + z(windows)时传递的。
答案 4 :(得分:4)
一些拼写错误:
while((c = getchar())!= EOF)
取代:
while((c = getchar() != EOF))
此外,getchar()将返回键视为有效输入,因此您也需要缓冲它.EOF是一个标记,用于指示输入结束。通常它是一个设置了所有位的int。
#include <stdio.h>
int main()
{
int c;
while((c = getchar())!= EOF)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}
printf("%d %u %x- at EOF\n", c , c, c);
}
打印:
49 50 -1 4294967295 ffffffff- at EOF
输入:
1 2 <ctrl-d>
答案 5 :(得分:3)
来自终端的输入从未真正&#34;结束&#34; (除非设备断开连接),但输入多个&#34;文件&#34;到终端,所以保留一个键序列以指示输入的结束。在UNIX中,键击到EOF的转换由终端驱动程序执行,因此程序不需要将终端与其他输入文件区分开。默认情况下,驱动程序将行开头的Control-D字符转换为文件结束指示符。要在输入流中插入实际的Control-D(ASCII 04)字符,用户在其前面加上&#34; quote&#34;命令字符(通常是Control-V)。 AmigaDOS类似,但使用Control- \而不是Control-D。
在Microsoft的DOS和Windows(以及CP / M和许多DEC操作系统)中,从终端读取将永远不会产生EOF。相反,程序认识到源是终端(或其他&#34;字符设备&#34;)并将给定的保留字符或序列解释为文件结束指示符;最常见的是这是一个ASCII Control-Z,代码26.一些MS-DOS程序,包括Microsoft MS-DOS shell(COMMAND.COM)和操作系统实用程序(如EDLIN)的一部分,处理Control-Z在文本文件中标记有意义数据的结尾,和/或在写入文本文件时将Control-Z附加到末尾。这样做有两个原因:
与CP / M的向后兼容性。 CP / M文件系统仅以128字节&#34;记录&#34;的倍数记录文件的长度,因此按照惯例,如果有意义的数据在中间结束,则使用Control-Z字符标记有意义数据的结尾记录。 MS-DOS文件系统始终记录文件的确切字节长度,因此在MS-DOS上永远不需要这样做。
- 醇>
它允许程序使用相同的代码从终端和文本文件中读取输入。
答案 6 :(得分:1)
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
我认为这是检查EOF值的正确方法。 我检查了输出。
对于INPUT:abc和Enter我得到OUTPUT:97 98 99 10.(ASCII值)
对于INPUT Ctrl-D我得到了输出:-1 - 在EOF。 所以我认为-1是EOF的值。
尝试其他输入而不是Ctrl-D,如Ctrl-Z。 我认为它因编译器而异。
答案 7 :(得分:1)
为简单起见:EOF是值为-1的整数类型。因此,我们必须使用整数变量来测试EOF。
答案 8 :(得分:-1)
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) {
putchar(c);
}
printf("%d at EOF\n", c);
}
修改了上面的代码,使EOF更加清晰,按Ctrl + d和putchar用于打印char,避免在while循环中使用printf。
答案 9 :(得分:-1)
int c;
while((c = getchar())!= 10)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}