printf vs putchar - 不同的输出

时间:2014-06-08 17:23:03

标签: c

我有这个简单的代码(尝试在KandR中进行练习): -

#include <stdio.h>

int main(){
 int c = EOF;

 while(c=(getchar() != EOF)){
   printf("%d",c);
 }

return 0;
}

当我运行它并输入任何字符(单个字符)时,我得到输出为11.如果我输入多个字符,例如'bbb',我得到输出为1111.我明白我已经明确添加了括号优先考虑getchar()!= EOF的条件检查,它应该导致1或0.但我不明白为什么我得到多个1。

另一个案例是:

#include <stdio.h>

int main(){
 int c = EOF;

 while(c=(getchar() != EOF)){
   putchar(c);
 }

return 0;
}

无论我输入哪个角色,我总是将输出作为一个方框,其中包含1和0(显示在下方屏幕截图的底部)

enter image description here

1)在第一种情况下,为什么输出打印超过1 1?

2)为什么案例2的输出与案例1不相同?

2 个答案:

答案 0 :(得分:3)

除非您按EOF,否则(getchar() != EOF)将返回true1c分配给11。这就是为什么输出始终为1,输入的字符为1,第二个\nputchar输入输入缓冲区键。

同样在1的情况下,它会打印与返回值32对应的字符,该字符是不可打印的(可打印字符从\n开始),您将获得一些奇怪的输出,一个用于输入字符,另一个用于while( (c=getchar()) != EOF ){...}

现在将条件表达式中的括号更改为

\n

现在它将按预期工作,但在第一种情况下会给你两个ASCII码(一个用于{{1}})。

答案 1 :(得分:2)

  

1)在第一种情况下,为什么输出打印超过1 1?

因为您正在寻找EOF。要从键盘发送程序EOF,请按 Ctrl + Z

  

2)为什么案例2的输出与案例1不相同?

因为%d生成字符代码的十进制表示,而putchar生成字符本身。例如,如果您使用'A'的{​​{1}}格式打印printf,则会看到%d - 大写字符65的ASCII代码。另一方面,如果您使用A进行打印,则会看到字符putchar本身。

Demo on ideone.