putchar和printf的行为不符合预期

时间:2017-07-03 21:39:58

标签: c printf putchar

我正在完成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. 当我输入一个字符并按版本1输入时,为什么我在屏幕上看不到0或1?相反,我的光标移动到下一行的第一个位置,否则为空。我虽然putchar会将c发送给stdout

  2. 虽然在第二个版本中使用printf会产生适当的0或1,但它会为每个非EOF字符复制1(我在每个字符的两个连续行上看到数字1我输入)。为什么呢?

  3. 非常感谢您的想法。如果有您认为有帮助的参考,请发送链接。

    澄清:

    我知道我正在为c赋值0或1.这就是我想要做的,而这正是练习所需要的。这也是我c = getchar()周围没有括号的原因。我的问题更多地解释为什么输出不是我预期的。抱歉有任何困惑。

1 个答案:

答案 0 :(得分:3)

赋值运算符=的优先级低于不等式运算符!=

所以这个:

while (c = getchar() != EOF)

解析为:

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

因此c如果getchar不是EOF,则为EOF分配布尔值,如果返回%d,则为{0}分配。

结果,第一个程序打印ASCII代码1的字符,这是一个不可打印的字符。这就是你什么也看不见的原因。第二个程序使用printf格式说明符getchar,将数字1转换为其字符串表示形式。

您需要括号才能将c的结果分配给while ((c = getchar()) != EOF)

c

编辑:

为了进一步阐明您获得的输出,在两个程序中,变量while在每个putchar循环内的值为1。这里的区别在于printf正在打印ASCII值为1的字符(不可打印的字符),而带有%d的{​​{1}}打印值1的文本表示,即{{ 1}}。

如果您将1调用更改为:

printf

您将获得与使用printf("%c", c); 相同的输出。

至于每个字符打印1次,这是因为您实际输入了两个字符:您按下的键和输入键。从控制台读取时,在按下回车键之前,putchar功能不会返回。