2014-06-08 61 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