在K&R书(C编程语言第2版)中进行练习时,我遇到了一个我似乎没有掌握和理解的问题 . 也就是说,练习是编写一个计算空格,制表符和新行的程序(在本书的最开头) . 我正在写debian / gedit(dunno,如果这是相关的) .
我写的代码是:
#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 .
还有一个特定的期望条件,你应该或不应该为getchar()分配一个int?
在编写代码时执行代码会产生预期的结果,但说实话,我似乎并不了解这里发生了什么 .
任何形式的帮助表示赞赏,并提前感谢 .
4 回答
这是因为每个
getchar()
调用都会从输入中读取另一个字符 . 所以你以后不能用它来检查空格 .您需要分配给变量,因为以后要使用它 . 您编写的方式不适用于您尝试解决的问题 .
不,你是否应该分配是没有规则的 . 这取决于您解决的具体问题 . 如果要稍后使用/检查该值,则应指定 .
例如,如果您只是想忽略空格,那么:
将
c
分配给getchar
确实很重要 .它实际上做的是三个步骤:
getchar()
从标准输入流(stdin
)中获取一个字符 .然后将读取的字符分配给
c
.然后将
c
与EOF
进行比较 .不会 . 您的代码没有预期的行为,因为您在
while
循环内多次调用getchar
. 你的代码实际上做的是:从标准输入
stdin
读取 first char .将第一个字符与EOF进行比较 .
那么如果它不是
EOF
,则来自stdin的 read a second char .将 second char 与
' '
进行比较 .等等 .
您可以看到为什么它不是预期的行为,因为您需要的是读取 single char 并与所有值进行比较 .
你在每个
if
测试中反复调用getchar()
.你会错过很多潜在的匹配,因为每次调用
getchar
会从输入缓冲区中消耗另一个字符 .您应该将
getchar()
的返回值分配给变量,每个循环一次,并测试它 .while((c = getchar()) != EOF)
将适用于此,并在循环体中测试c
.首先,
c
未分配给getchar()
,而getchar()
分配给c
.继续,这里我们只是将
getchar()
中读取的字符存储在c
中,以检查输入的字符是 `` (空格)还是\n
或后续代码中的任何内容 .根据
man getchar
如果我们没有在
c
中存储由getchar()
读取的字符并在后续代码中使用单独的getchar()
函数调用,那么我们将失去getchar()
在开头和其他getchar()
调用中读取的内容 .