putchar 和 printf 未按预期运行
putchar and printf not behaving as expected
我正在完成 K&R 中的一些练习。练习 1-6 要求验证表达式 getchar() != EOF
是 0 还是 1。我明白这是为什么,但我编写的代码证明它没有按预期工作。我写了以下两个片段:
版本 1:
int main(void)
{
int c;
while (c = getchar() != EOF)
{
putchar(c);
}
printf("%d at EOF\n", c);
return 0;
}
版本 2:
int main(void)
{
int c;
while (c = getchar() != EOF)
{
printf("%d\n", c);
}
printf("%d at EOF\n", c);
return 0;
}
我的问题:
当我在第一个版本中输入一个字符并按回车键时,为什么我在屏幕上看不到 0 或 1?相反,我的光标移动到下一行的第一个位置,否则它是空的。我虽然 putchar
会发送 c
到 stdout
.
虽然在第二个版本中使用 printf
确实会适当地生成 0 或 1,但它会为每个非 EOF 字符复制 1(我在连续两个字符上看到数字 1我输入的每个字符的行)。为什么?
非常感谢您的想法。如果有您认为有帮助的参考,请发送 link.
澄清:
我知道我正在为 c 分配 0 或 1 的值。这就是我想要做的,也是练习想要的。这也是我在 c = getchar()
两边没有括号的原因。我的问题更多地涉及理解为什么输出不是我所期望的。抱歉造成任何混淆。
赋值运算符 =
的优先级低于不等运算符 !=
.
所以这个:
while (c = getchar() != EOF)
解析为:
while (c = (getchar() != EOF))
因此,如果 getchar
不是 EOF
,则 c
被赋予布尔值 1,如果 return EOF
.[=33,则被赋予布尔值 0 =]
结果,第一个程序打印了ASCII码1的字符,这是一个不可打印的字符。这就是为什么你什么都看不到的原因。第二个程序将 %d
格式说明符用于 printf
,将数字 1 转换为其字符串表示形式。
您需要括号将 getchar
的结果分配给 c
:
while ((c = getchar()) != EOF)
编辑:
为了进一步阐明您得到的输出,在两个程序中,变量 c
在每个 while
循环中的值为 1。这里的区别在于 putchar
打印 ASCII 值为 1 的字符(不可打印字符),而 printf
和 %d
打印值 1 的文本表示,即 1
.
如果您将 printf
调用更改为:
printf("%c", c);
您将获得与使用 putchar
相同的输出。
至于每个字符打印两次1,那是因为你实际上输入了两个字符:你按下的键,加上回车键。从控制台读取时,getchar
函数不会 return 直到按下回车键。
我正在完成 K&R 中的一些练习。练习 1-6 要求验证表达式 getchar() != EOF
是 0 还是 1。我明白这是为什么,但我编写的代码证明它没有按预期工作。我写了以下两个片段:
版本 1:
int main(void)
{
int c;
while (c = getchar() != EOF)
{
putchar(c);
}
printf("%d at EOF\n", c);
return 0;
}
版本 2:
int main(void)
{
int c;
while (c = getchar() != EOF)
{
printf("%d\n", c);
}
printf("%d at EOF\n", c);
return 0;
}
我的问题:
当我在第一个版本中输入一个字符并按回车键时,为什么我在屏幕上看不到 0 或 1?相反,我的光标移动到下一行的第一个位置,否则它是空的。我虽然
putchar
会发送c
到stdout
.虽然在第二个版本中使用
printf
确实会适当地生成 0 或 1,但它会为每个非 EOF 字符复制 1(我在连续两个字符上看到数字 1我输入的每个字符的行)。为什么?
非常感谢您的想法。如果有您认为有帮助的参考,请发送 link.
澄清:
我知道我正在为 c 分配 0 或 1 的值。这就是我想要做的,也是练习想要的。这也是我在 c = getchar()
两边没有括号的原因。我的问题更多地涉及理解为什么输出不是我所期望的。抱歉造成任何混淆。
赋值运算符 =
的优先级低于不等运算符 !=
.
所以这个:
while (c = getchar() != EOF)
解析为:
while (c = (getchar() != EOF))
因此,如果 getchar
不是 EOF
,则 c
被赋予布尔值 1,如果 return EOF
.[=33,则被赋予布尔值 0 =]
结果,第一个程序打印了ASCII码1的字符,这是一个不可打印的字符。这就是为什么你什么都看不到的原因。第二个程序将 %d
格式说明符用于 printf
,将数字 1 转换为其字符串表示形式。
您需要括号将 getchar
的结果分配给 c
:
while ((c = getchar()) != EOF)
编辑:
为了进一步阐明您得到的输出,在两个程序中,变量 c
在每个 while
循环中的值为 1。这里的区别在于 putchar
打印 ASCII 值为 1 的字符(不可打印字符),而 printf
和 %d
打印值 1 的文本表示,即 1
.
如果您将 printf
调用更改为:
printf("%c", c);
您将获得与使用 putchar
相同的输出。
至于每个字符打印两次1,那是因为你实际上输入了两个字符:你按下的键,加上回车键。从控制台读取时,getchar
函数不会 return 直到按下回车键。