Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C EOF增加了计数器,不知道为什么_C_Kernighan And Ritchie - Fatal编程技术网

C EOF增加了计数器,不知道为什么

C EOF增加了计数器,不知道为什么,c,kernighan-and-ritchie,C,Kernighan And Ritchie,我一直在试图理解为什么使用ctrl-D触发eof会在for循环中添加计数器 这是我的密码: #include <stdio.h> int main() { double nc; for (nc = 0; getchar() != EOF; nc++){ getchar(); } printf("%.0f\n", nc); return 0; } 8是我在输入7后使用ctrl-D时得到的。触发eof会导致代码运行另一个完整循环,这

我一直在试图理解为什么使用ctrl-D触发
eof
会在
for
循环中添加计数器

这是我的密码:

#include <stdio.h>
int main()
{
    double nc;
    for (nc = 0; getchar() != EOF; nc++){
       getchar();
    }
    printf("%.0f\n", nc);
    return 0;
}
8
是我在输入
7
后使用ctrl-D时得到的。触发
eof
会导致代码运行另一个完整循环,这有什么原因吗?
我认为空缓冲区不会返回任何内容。

这里有一些内容可能会丢失。从您的代码中选取一段:

for (nc = 0; getchar() != EOF; nc++)
    getchar();
有两个
getchar()
。让我们调用它们,
getchar1()
getchar2()
。您的输入应如下所示:

0\n
.
.
.
7\n
EOF
getchar1()
捕获数字序列和
EOF
getchar2()
始终捕捉换行符('\n')。循环体通过的次数是8(0到7)


希望对您有所帮助。

您每次迭代调用
getchar
两次。你确定这就是你想要的吗?为什么像@Quentin说的那样,你要调用两次
getchar
。如果你想让它在按下Ctrl+D时停止,请删除循环体。我建议关闭这个线程,它没有意义,太宽了。@xing oh。问题的格式被破坏了,所以我没有看到换行符。嗯,我想我明白了。当我去掉第二个getchar()时,计数器会上升2而不是1,所以我添加了第二个getchar()以停止第二次迭代。有没有另一种方法可以使柜台上升一点?奇怪的是,如果我不使用eof作为for循环的条件,计数器可以正常工作。我不确定您是否要计算除换行符之外的字符串数或字符数。使用除换行符之外的字符计数,您可以通过
而(1)开关(getchar()){case'\n':continue;case EOF:break;default:nc++;}
来完成。感谢您的回复。我正在完成一个查找字符数的练习,这也是我正在寻找的。我是C语言的新手,所以我以前从未见过switch语句,这将有助于解决我的问题。
0\n
.
.
.
7\n
EOF