计数线“C编程语言”K& R.

时间:2013-10-15 18:24:42

标签: c

我的计算输入行数的代码似乎有效。这是:

#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的返回值。

6 个答案:

答案 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”的检查中再次调用它时,您将获得该字符后的字符并进行比较,因此您实际上正在阅读每次两个字符,这是错误的。