ctrl-d没有';t停止while(getchar()!=EOF)循环

ctrl-d没有';t停止while(getchar()!=EOF)循环,c,unix,eof,C,Unix,Eof,这是我的密码。我用终端在ubuntu中运行它。当我在终端中输入(CtrlD)时,程序没有停止,而是继续等待我的输入 在unix中,CtrlD不等于EOF吗 多谢各位 #include<stdio.h> main() { int d; while(d=getchar()!=EOF) { printf("\"getchar()!=EOF\" result is %d\n", d); printf("EOF:%d\n", EOF);

这是我的密码。我用终端在ubuntu中运行它。当我在终端中输入(CtrlD)时,程序没有停止,而是继续等待我的输入

在unix中,CtrlD不等于EOF吗

多谢各位

#include<stdio.h>

main() {
    int d;
    while(d=getchar()!=EOF) {
        printf("\"getchar()!=EOF\" result is %d\n", d);
        printf("EOF:%d\n", EOF);
    }
        printf("\"getchar()!=EOF\" result is %d\n", d);
}
#包括
main(){
int d;
while(d=getchar()!=EOF){
printf(“\”getchar()!=EOF\”结果为%d\n“,d);
printf(“EOF:%d\n”,EOF);
}
printf(“\”getchar()!=EOF\”结果为%d\n“,d);
}

EOF不是字符。
EOF
是一个宏,当到达输入端或遇到某种错误时,
getchar()
返回该宏。
^D
不是“EOF字符”。在linux下,当您单独在一行中点击^D时,它会关闭流,并且
getchar()
调用到达输入端并返回
EOF
宏。如果在一行中的某个位置键入<代码> ^ d/COD>,则流没有关闭,因此<代码> GETCHARE()/<代码>返回它读取的值,并且循环不退出。< /P> 有关更好的描述,请参阅

此外:

在现代系统中,它不反映文件中存储的任何实际文件结束字符;这是一个没有更多字符可用的信号


除了Jon Lin关于EOF的回答之外,我不确定您编写的代码是否符合您的意图。如果要在变量
d
中查看从
getchar
返回的值,需要将
while
语句更改为:

    while((d=getchar())!=EOF) {

这是因为不等式运算符的优先级高于赋值运算符。因此,在代码中,
d
总是
0
1

这不是递归。这只是一个无限循环,直到输入下线。递归=函数直接调用自身或在其他中间步骤之后调用自身。使用gcc编译该函数,点击
^D
可以为我停止循环。@JonLin只需输入^D。它也适用于我。但是,当输入为(a^D)时;循环没有停止。@MarcB我犯了一个愚蠢的错误。谢谢你的帮助。我仔细阅读了网站。在我看来,如果我在一行中键入<代码> ^ d /代码>某处,BASH将处理<代码> ^ d>代码>。结果,C程序没有得到关闭流的命令。如果我在一行中键入
^D
,C程序将获得正确的命令。我说得对吗?@qingfeng这里还有一点关于
^D
的内容:但是,是的,除非它自己在线上,否则小溪不会关闭。此处的简短说明:当终端处于规范模式时,只有按enter键才能通过tty设备传输线路。按已配置的EOF键(默认情况下为^D)会立即传输数据,并且等待它的任何
读取的
都会返回可用字符数。如果行上已经有数据,这将是正常的非零长度读取。如果该行为空,将导致读取长度为零,这是文件描述符上文件结束状态的定义。因此,stdio层会将其解释为EOF状态。@qingfeng:bash与此无关;当前正在运行的程序正在处理输入。@R..您的注释应该是答案,并且应该是最上面的答案。现在很难找到完整的“幕后”信息……你能如此细致,真是太好了。但是我只想验证表达式
d=getchar()=EOF
为0或1。@山姆:您可以通过编写:
while((d=(getchar()!=EOF))!=0)
或as
while((d=(getchar()!=EOF)))
来明确分配比较结果,这样编译器就不会向您发出警告。更常见的替代方法是
while((d=getchar())!=EOF)
,它将
getchar()
的结果分配给
d
,然后将其与EOF进行比较。这样可以避免编译器警告。许多现代编译器会为您编写的内容生成警告。