将 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
。
- 然后
c
与EOF
进行比较。
Should the way i wrote it not work the same?
while(getchar() != EOF)
{
if(getchar() == ' ')
++nb;
没有。您的代码没有预期的行为,因为您在 while
循环中多次调用 getchar
。您的代码实际做的是:
- 从标准输入
stdin
读取第一个字符。
- 将第一个字符与 EOF 进行比较。
- 然后如果它不是
EOF
,从标准输入读取第二个字符。
- 比较 第二个字符 与
' '
。
- 以此类推
您会明白为什么这不是预期的行为,因为您需要读取 单个字符 并与所有值进行比较。
在做 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
。 - 然后
c
与EOF
进行比较。
Should the way i wrote it not work the same?
while(getchar() != EOF)
{
if(getchar() == ' ')
++nb;
没有。您的代码没有预期的行为,因为您在 while
循环中多次调用 getchar
。您的代码实际做的是:
- 从标准输入
stdin
读取第一个字符。 - 将第一个字符与 EOF 进行比较。
- 然后如果它不是
EOF
,从标准输入读取第二个字符。 - 比较 第二个字符 与
' '
。 - 以此类推
您会明白为什么这不是预期的行为,因为您需要读取 单个字符 并与所有值进行比较。