我的计算输入行数的代码似乎有效。这是:
#include <stdio.h>
int main()
{
int counter = 0;
while(getchar() != EOF)
{
if(getchar() == '\n')
{
counter += 1;
}
}
printf("Counter: %d", counter);
return 0;
}
但是我的问题是为什么在K&amp; R的书中他们将getchar返回值存储在一个变量中,只是在while循环条件下测试为true或false?我认为没有理由这样做。
K&amp; R的版本:
#include <stdio.h>
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n') ++nl;
printf("%d\n", nl);
}
注意“int c”存储了getchar的返回值。
答案 0 :(得分:4)
你正在做的是你正在阅读一个角色并检查它是否等于EOF
。然后你正在阅读另一个角色并将其与\n
进行比较。这可能会或可能不会给你一个错误的答案,但方法不正确,有时会失败。
在书中,他们读取一个字符并将其存储在变量c中,并检查它是否为EOF
。然后他们将c
与\n
进行比较,这是正确的方法。
答案 1 :(得分:4)
例如,如果第一个getchar()
读取换行符并且条件'\n !=EOF
变为true,则进入循环
while(getchar() != EOF)
{
if(getchar() == '\n') // here reads next character that is not newline
{
counter += 1; // missed counting newline , which read by first `getchar()`
}
}
如上所示,一个人无法正常工作。
答案 2 :(得分:2)
K&amp; R使用变量的原因是每次迭代都不会调用getchar()
两次,每次调用getchar()
时,都会更改输入流的状态。
答案 3 :(得分:1)
为了澄清Kunal的答案,你的版本只检查每两个字符中一个字符的EOF /换行符,因为第二个getchar()从文件中读取另一个字符。 K&amp; R为每个角色都这样做。
答案 4 :(得分:1)
您正在调用getchar()
两次,这将读取两个不同的字符。在“K&amp; R”代码中,它们将getchar
的结果存储在变量中,以便可以在循环内进行分析。它在功能上等同于:
char c = getchar();
while (c != EOF)
{
if (c == '\n')
{
++nl;
}
c = getchar();
}
printf("%d\n", nl);
答案 5 :(得分:1)
getchar()返回stdin的下一个字符。
当您在if语句中调用它时,您将获得下一个字符,但是当您在对“\ n”的检查中再次调用它时,您将获得该字符后的字符并进行比较,因此您实际上正在阅读每次两个字符,这是错误的。