printf和putchar的区别 - 输出不同

4

我有这样一段简单的代码(试图在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
你的 while 循环有误,请尝试使用 while ((c = getchar()) != EOF) - WhozCraig
对于putchar来说,如果要打印一个'1',就必须向它发送Ascii值49(十进制),而不是整数1。你遇到了值与字符的问题。 - Jiminion
你对第二个输出的描述是误导性的。代码的两个变体通常会产生完全相同的行格式,即第二个示例中不会有任何特殊的“框”。唯一的区别是第一个示例使用1作为输出字符,而第二个示例使用\x1作为输出字符。 - AnT stands with Russia
2个回答

3
除非你按下 EOF ,否则(getchar()!= EOF)将返回true,将 1 分配给 c 。这就是为什么您始终会得到输出为 11 的原因,第一个 1 是输入的字符,第二个 1 是在按下 Enter 键时传递到输入缓冲区的 \n
类似地,在 putchar 的情况下,它打印与返回值 1 相对应的字符,该字符不可打印(可打印字符从 32 开始),您将获得一些奇怪的输出,一个用于输入字符,另一个用于 \n
现在将条件表达式中的括号更改为
while( (c=getchar()) != EOF ){...}   

现在它将按照应该的方式工作,但在第一种情况下会给您两个ASCII代码(其中一个是\n)。

所以这个 putchar 处理字符直到收到 \n,从而标记流的结束?我理解得对吗? - user720694
\n 也是一个字符,但它不可打印,putchar 将其简单地输出到屏幕上。 - haccks
在第二种情况下,如果我将putchar行更改为putchar((char)c);它也不会打印预期的输出即1。为什么? - user720694
1 是 ASCII 中的不可打印字符。将 c 强制转换为 char 在这里是无济于事的。你会得到一些奇怪的东西。 - haccks

2

1)在第一个例子中,输出为什么打印出了多个1?

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

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

因为%d会产生字符码的十进制表示,而putchar则会输出字符本身。例如,如果使用printf%d格式打印'A',则会看到65——大写字母A的ASCII码。另一方面,如果使用putchar打印,您将看到字符A本身。

ideone上的演示。


Ctrl+Z 发送的是挂起信号,而不是 EOF。 - Darkhogg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接