2017-07-03 75 views
1

我正在通過K & R中的一些練習來工作。練習1-6要求驗證表達式getchar() != EOF是0還是1.我理解它的原因,但代碼我寫信證明它沒有按預期工作。我寫了下面的兩個片段:putchar和printf沒有像預期的那樣運行

版本1:

int main(void) 
{ 
    int c; 

    while (c = getchar() != EOF) 
    { 
     putchar(c); 
    } 

    printf("%d at EOF\n", c); 

    return 0; 
} 

版本2:

int main(void) 
{ 
    int c; 

    while (c = getchar() != EOF) 
    { 
     printf("%d\n", c); 
    } 

    printf("%d at EOF\n", c); 

    return 0; 
} 

我的問題:

  1. 當我在一個角色類型和命中進入與版本一,爲什麼我在屏幕上看不到0或1?相反,我的光標移動到下一行的第一個位置,否則爲空。我雖然putchar會發送cstdout

  2. 儘管在第二個版本中使用printf確實會產生0或1,但它會爲每個非EOF字符(我在輸入的每個字符在兩個連續行上看到數字1)重複1。爲什麼?

非常感謝您的想法。如果有您認爲有用的參考資料,請發送鏈接。

澄清:

我知道我指定的C 0或1。這就是我想要做的值,它是行使想要什麼。這也是爲什麼我沒有圍繞c = getchar()的括號。我的問題更多的是理解爲什麼產量不符合我的預期。對不起,有任何困惑。

+0

你應該啓用警告'-Wall -Wtratra' – Stargateur

+0

我實際編譯了gcc代碼。我在一個由課程(CS50)提供的IDE中工作,當我嘗試使用make和clang編譯時,我不能。這些警告不會阻止我的代碼編譯? – BruceM

+0

「每個非EOF字符爲1」 - >所有字符均爲非EOF。 End-of_file是一個條件,而不是一個字符。 – chux

回答

3

賦值運算符=的優先級低於不等式運算符!=

所以這個:

while (c = (getchar() != EOF)) 

所以後來c被賦予布爾值1,如果getcharEOF和0,如果它不返回EOF:作爲

while (c = getchar() != EOF) 

解析。

因此,第一個程序打印ASCII代碼1的字符,這是一個不可打印的字符。這就是爲什麼你什麼都看不到。第二個程序使用%d格式說明符至printf將數字1轉換爲其字符串表示形式。

你需要圓括號有getchar分配給c結果:

while ((c = getchar()) != EOF) 

編輯:

爲了進一步澄清你得到的輸出,在這兩個程序變量c值爲1每個while循環內。這裏的區別在於putchar正在打印ASCII值爲1的字符(不可打印字符),而printf%d打印值爲1的文本表示,即1

如果更改了printf調用此:

printf("%c", c); 

你會得到相同的輸出使用putchar

至於每個字符兩次打印1次,那是因爲你實際上輸入了兩個字符:你按的鍵和回車鍵。從控制檯讀取數據時,只有按下回車鍵後,纔會返回getchar功能。

+1

您沒有回答問題的部分「它爲每個非EOF字符重複1,爲什麼?」 (我猜這是因爲OP忘記他按Enter鍵) –

+0

@dbush,你能解釋一下爲什麼我看到每輸入一個非EOF字符兩次的值1? – BruceM

+1

@BruceM看我的編輯。額外的輸出是來自輸入鍵的換行符。 – dbush

相關問題