2010-09-02 73 views
6

我有以下程序:这个C程序为什么在输出中打印奇怪的字符?

#include <stdio.h> 

int main() 
{ 
     int ch; 
     while(ch = getchar() != '\n') { 
       printf("Read %c\n",ch); 
     } 
     return 0; 
} 

不管我进入我得到:

Read 

这是怎么回事,什么是奇怪的字符,我看到了什么?

Stackoverflow不打印奇怪的字符。你可以在这里看到:http://ideone.com/EfZHr

+1

如果您使用的是gcc,请确保设置了-Wall标志。它报告的许多常见问题之一就是这个问题。 – JeremyP 2010-09-02 13:50:22

回答

18

您需要将括号为:

while((ch = getchar()) != '\n') 

!=Precedence比的=

while(ch = getchar() != '\n') 

更大的是一样的:

while(ch = (getchar() != '\n')) 
读取一个字符的

比较它用换行符,然后将比较结果分配给ch。现在,比较的结果是0(当进入行)或1(输入任何东西时)

你看到的奇怪字符将是control char与价值1,对于ASCII 1没有印刷的象征,所以我猜它的壳体打印出奇怪的字符值为0001

你可以通过你的程序的输出管道,以八进制转储(OD)确认:与-Wall使用时

$ echo 'a' | ./a.out | od -bc   # user entered 'a' 
0000000 122 145 141 144 040 001 012 
      R e a d  001 \n 
here you go ----------------^ 


$ echo '\n' | ./a.out | od -bc  # user entered '\n' 
0000000 

GCC警告您为:

warning: suggest parentheses around assignment used as truth value 
+1

相同的优先查找参考:D – 2010-09-02 12:12:51

1
ch = getchar() != '\n' 

写这将导致意外的行为取决于语言operator precedence。在C =之后评估!=因此ch将是真或假。尝试:

(ch = getchar()) != '\n' 
+1

难道你没有任何更清晰的单词意味着失败吗? – 2010-09-03 04:54:32

+0

我确实在做 - 不知道我为什么选择昨天的措辞,但改变了它。 – 2010-09-03 07:27:05

2

C(和C++)解释while循环:

while(ch = (getchar() != '\n')) { 

所以ch得到值1(真正的),这是一个不可打印的字符。您应该使用明确的括号来修复优先级:

while((ch = getchar()) != '\n') { 
+3

C,而不是C++好友。 – Puppy 2010-09-02 12:17:51

+0

啊,的确如此。但是这适用于两个:) – bdonlan 2010-09-02 14:58:35