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;
}

我的问题:

  1. 当我在第一个版本中输入一个字符并按回车键时,为什么我在屏幕上看不到 0 或 1?相反,我的光标移动到下一行的第一个位置,否则它是空的。我虽然 putchar 会发送 cstdout.

  2. 虽然在第二个版本中使用 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 直到按下回车键。