我已经开始学习C了,我也开始使用Ubuntu了。我正在通过终端在vim中编写代码。我一直在学习Kernighan和Ritchie。这是代码 -
#include <stdio.h>
int main()
{
int c;
while ( (c = getchar()) != EOF)
putchar(c);
return 0;
}
现在,我的问题是: -
答案 0 :(得分:13)
正在发生两件不同的事情。
在Windows中键入Control-Z或在Linux中键入Control-D会触发文件结束条件,并导致getchar()
返回值EOF
。
在Linux中键入Control-Z会有所不同:它暂停程序的执行。键入Control-Z后,如果键入jobs
命令,它将显示已暂停的程序。键入fg
将使其恢复并继续接受输入 - 直到您通过键入Control-D发出文件结束信号。如果您的程序生成了一些输出,那将更容易看到。
Control-Z的行为与程序的编写方式无关; Control-Z将暂停(几乎)任何正在运行的程序,无论它是否用C语言编写,以及它是否在等待输入。这种行为特定于Linux和其他类Unix操作系统。
你可能永远不会用完doubts and questions;我当然没有。
答案 1 :(得分:1)
Windows中的CTRL + Z和Linux中的CTRL + D 发送 EOF值到stdin,EOF本身是实现定义的。只有CTRL + D在linux中工作。您可以像printf("%d", EOF);
一样打印它以查看其数值。
是的,怀疑和想法总是有用的=)
答案 2 :(得分:0)
C中的EOF是一个条件(“文件结束”),而不是一个告诉你已经到达终点的特殊字符 - 没有更多的输入。这个条件通过各种函数指示给你,比如getchar()返回特殊值EOF.EOF只是一个值(通常是一个#defined为-1的宏),否则不会出现在这些函数读取的数据中。
如果从文件或管道中读取,则当getchar()返回EOF时,您知道已到达该文件的末尾。 getchar()从stdin读取。通过将程序作为echo hello | ./theprogram
如果您从终端/控制台读取输入,事情会更复杂。在某些系统中,huge layers涉及将键盘输入引入程序。
但是短版本是在某些系统上,当你点击CTRL + D(或其他人的CTRL + Z)键组合时,它能够通知你的程序输入结束,这使得getchar()返回EOF。
对于linux上的CTRL + z,这将暂停(暂停,但不终止)当前前台进程。