将 int 分配给 getchar() 与不使用 getchar() 之间的区别

Difference between assigning a int to getchar() and using getchar() without it

在做 K&R 书(C 编程语言第 2 版)的练习时,我 运行 遇到了一个我似乎没有掌握和理解的问题。也就是说,练习是编写一个计算空格、制表符和换行符的程序(在本书的开头)。我正在写 debian/gedit(不知道这是否相关)。

我写的代码是:

#include <stdio.h>

int main(void)

{

int nb = 0;         
int nt = 0;         
int nl = 0;         

while(getchar() != EOF)

    {
    if(getchar() == ' ')
        ++nb;
    if(getchar() == '\t')
        ++nt;
    if(getchar() == '\n') 
        ++nl;
    }
printf("%d\n%d\n%d\n", nb, nt, nl);

return 0;
}

现在,当我执行该程序时,它不会计算空格或制表符,而且通常不会按预期运行。

然后我在书中检查了正确答案,我看到他们已经将 int c 分配给了 getchar() 即

while((c = getchar()) != EOF)
    if(c == ' ')
     ++nb;

等等。

现在我不明白的是为什么在这种情况下将 int 分配给 getchar() 而不是在 IF 括号中使用它很重要。我写的方式应该不一样吗?

据我所知,int c 不是确定值或精确值,所以对我这个初学者来说,它的唯一目的就是分配它,这样我们就不必每次都写 getchar() 并且可以简单地写成 c.

是否还有特定的期望条件,您应该或不应该将 int 分配给 getchar()?

按照他们编写的代码执行代码会得到预期的结果,但老实说,我似乎不明白这里到底发生了什么。

感谢任何形式的帮助,并提前致谢。

这是因为每个 getchar() 调用从输入中读取另一个 字符。所以你以后不能用它来检查 white-spaces.

what i don't understand is why is it important to assign a int in this case c to getchar() and than use it in IF brackets. Should the way i wrote it not work the same?

您需要给一个变量赋值,因为您要稍后使用它。您的写作方式不适用于您尝试解决的问题。

Also is there a specific desired condition where you should or should not assign a int to getchar()?

没有。是否应该分配没有规则。这取决于您解决的具体问题。如果您想稍后 use/check 该值,您应该分配。

例如,如果您只想忽略一个空格,那么:

int c = gethchar();
getchar(); // Simply discard one character from inout

您在每个 if 测试中重复调用 getchar()

你会错过很多潜在的匹配项,因为每次调用 getchar 都会消耗输入缓冲区中的另一个字符。

您应该将 getchar() 的 return 分配给一个变量,每个循环一次,然后对其进行测试。 while((c = getchar()) != EOF) 会很好地工作,并在循环体中测试 c

Now what i don't understand is why is it important to assign a int in this case c to getchar() and than use it in IF brackets. Should the way i wrote it not work the same?

首先这里 c 不是 分配给 getchar()getchar() 分配给 c

继续,这里我们只是将getchar()读取的字符存储在c中,以检查输入的字符是否为</code>(space ) 或 <code>\n 或后续代码中的任何内容。

根据 man getchar

getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.


如果我们没有将 getchar() 读取的字符存储在 c 中并在后续代码中使用单独的 getchar() 函数调用,那么我们将丢失 getchar() 读取的内容在开头以及其他 getchar() 调用中。

Now what i don't understand is why is it important to assign a int in this case c to getchar() and than use it in IF brackets.

c分配给getchar确实很重要。

while((c = getchar()) != EOF)

它实际上做了三个步骤:

  • getchar() 从标准输入流中获取一个字符 (stdin)。
  • 然后将读取的字符分配给c
  • 然后cEOF进行比较。

Should the way i wrote it not work the same?

while(getchar() != EOF)

    {
    if(getchar() == ' ')
        ++nb;

没有。您的代码没有预期的行为,因为您在 while 循环中多次调用 getchar。您的代码实际做的是:

  • 从标准输入stdin读取第一个字符
  • 将第一个字符与 EOF 进行比较。
  • 然后如果它不是 EOF从标准输入读取第二个字符
  • 比较 第二个字符 ' '
  • 以此类推

您会明白为什么这不是预期的行为,因为您需要读取 单个字符 并与所有值进行比较。