2017-07-03 58 views
1

我正在通过K & R中的一些练习来工作。练习1-6要求验证表达式getchar() != EOF是0还是1.我理解它的原因,但代码我写信证明它没有按预期工作。我写了下面的两个片段:putchar和printf没有像预期的那样运行

版本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。为什么?

非常感谢您的想法。如果有您认为有用的参考资料,请发送链接。

澄清:

我知道我指定的C 0或1。这就是我想要做的值,它是行使想要什么。这也是为什么我没有围绕c = getchar()的括号。我的问题更多的是理解为什么产量不符合我的预期。对不起,有任何困惑。

+0

你应该启用警告'-Wall -Wtratra' – Stargateur

+0

我实际编译了gcc代码。我在一个由课程(CS50)提供的IDE中工作,当我尝试使用make和clang编译时,我不能。这些警告不会阻止我的代码编译? – BruceM

+0

“每个非EOF字符为1” - >所有字符均为非EOF。 End-of_file是一个条件,而不是一个字符。 – chux

回答

3

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

所以这个:

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

所以后来c被赋予布尔值1,如果getcharEOF和0,如果它不返回EOF:作为

while (c = getchar() != EOF) 

解析。

因此,第一个程序打印ASCII代码1的字符,这是一个不可打印的字符。这就是为什么你什么都看不到。第二个程序使用%d格式说明符至printf将数字1转换为其字符串表示形式。

你需要圆括号有getchar分配给c结果:

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

编辑:

为了进一步澄清你得到的输出,在这两个程序变量c值为1每个while循环内。这里的区别在于putchar正在打印ASCII值为1的字符(不可打印字符),而printf%d打印值为1的文本表示,即1

如果更改了printf调用此:

printf("%c", c); 

你会得到相同的输出使用putchar

至于每个字符两次打印1次,那是因为你实际上输入了两个字符:你按的键和回车键。从控制台读取数据时,只有按下回车键后,才会返回getchar功能。

+1

您没有回答问题的部分“它为每个非EOF字符重复1,为什么?” (我猜这是因为OP忘记他按Enter键) –

+0

@dbush,你能解释一下为什么我看到每输入一个非EOF字符两次的值1? – BruceM

+1

@BruceM看我的编辑。额外的输出是来自输入键的换行符。 – dbush

相关问题