2014-06-08 60 views
4

我有这个简单的代码(试图做KandR练习): -的printf VS的putchar - 不同的输出

#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

你是while while循环是错误的。尝试'while((c = getchar())!= EOF)' – WhozCraig

+0

对于putchar打印'1',你必须发送Ascii值为1(49十进制)而不是整数1。价值与人品问题。 – Jiminion

+0

您对第二个输出的描述有误导性。代码的两种变体通常会产生绝对相同的行格式,即在第二个例子中不会有任何特殊的“盒子”。唯一的区别是第一个例子使用'1'作为输出字符,而第二个例子使用'\ x1'作为输出字符。 – AnT

回答

3

直到除非你按EOF(getchar() != EOF)将返回true其分配给1c。这就是为什么你总是得到输出为11,第一个1为你输入的字符,第二个1\n输入键传递到输入缓冲区。

同样在putchar情况下,打印对应的返回值1这是不可打印(打印字符从32开始)的字符,你会得到一些奇怪的输出,一个用于输入字符,另一个用于\n

现在改变条件表达式的括号

while((c=getchar()) != EOF){...} 

现在它会工作,因为它应该,但会给你在第一种情况下(一个用于\n)两个ASCII码。

+0

所以这个putchar处理字符,直到收到\ n,从而标记流的结束?我理解正确吗? – Karan

+0

'\ n'也是一个字符,但不可打印,'putchar'只是简单地将它放到屏幕上。 – haccks

+0

在第二种情况下,如果我将putchar行更改为putchar((char)c);它也不打印预期的输出,即1.为什么? – Karan

2

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

因为您正在寻找EOF。为了从键盘发送程序EOF,按下Ctrl键+ž

2)为什么不是2的情况下相同的情况下1的输出?

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

Demo on ideone.

+0

Ctrl + Z发送暂停信号,而不是EOF – Darkhogg