2010-09-02 112 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