2016-03-07 78 views
0

我正在編寫用於編碼字符的小程序,而且在閱讀NUL字符時也可能會遇到其他問題。我的問題是,代碼中的getchar忽略CTRL + @輸入的NUL字符。爲什麼getchar()在這兩種情況下的工作方式不同?

while ((numberOfRead < 40) && (character = getchar()) && (character != EOF) && (character != '\n')) { ... } 

但這個代碼正常工作,正確讀取NULL字符。

character = getchar(); 
while ((numberOfRead < 40) && (character != EOF) && (character != '\n')) { 
    numberOfChars++; 
    ... 
    character = getchar(); 
} 

導致問題的區別是什麼?謝謝你對這種行爲的任何解釋。代碼是在Windows 8.1測試,在GCC 4.7.1

+1

這就是爲什麼你應該避免在條件內賦值,使得編寫錯誤非常容易。 – Lundin

+0

^^^倫丁說的是什麼。我看起來很聰明,很酷,但實際上並沒有工作:(簡單,一次一個代碼,看似可避免的中間變量等導致工作,或者至少可調試,代碼複雜,複合布爾表達式導致帖子到SO :( –

+0

我很喜歡在這個條件下使用這個任務的想法,這是因爲我在最近閱讀過的K&R中的很多例子:) – c0ntrol

回答

1

這裏:

while (... && (character = getchar()) && ...) ... 
您使用的真值 character

。當讀取character是值爲0的空字符時,此條件爲false。

你可以這樣做:

while (numberOfRead < 40 
     && (character = getchar()) != EOF && character != '\n') { ... } 

,但我覺得你與getchar條件更具可讀性之外的第二個變體。

+0

我完全忘記了評估任務:) – c0ntrol

+0

是的,很容易錯過複合條件。 (這就是爲什麼我更喜歡你的第二個變體,因爲它清楚了調用getchar的位置。) –

相關問題