2013-10-15 28 views
2

我用於計算輸入行數的代碼似乎可行。那就是:計數行「The C Programming Language」K&R

#include <stdio.h> 

int main() 
{ 
    int counter = 0; 

    while(getchar() != EOF) 
    { 
     if(getchar() == '\n') 
     { 
      counter += 1; 
     } 
    } 

    printf("Counter: %d", counter); 

    return 0; 
} 

但我的問題是,爲什麼以K &的r的書,他們都儲存在它只是測試是在while循環條件真或假的變量中的getchar的返回值?我認爲沒有理由這樣做。

ķ&的r版本:

#include <stdio.h> 

main() 
{ 

int c, nl; 
nl = 0; 
while ((c = getchar()) != EOF) 
if (c == '\n') ++nl; 

printf("%d\n", nl); 
} 

的通知 「INT c」 被存儲的getchar的返回值。

+0

如果文件中的第一個字符是換行符會發生什麼?如果你連續有兩條新線?你第一次打電話給getchar()咀嚼一個字符,並且你無法知道究竟是什麼東西。 –

+0

@GeorgeMitchell我明白了,謝謝喬治。 –

+0

Think是每次調用'getchar()'讀取一個字符,讀一行,其中許多人繼續'\ n'爲:嘗試輸入文件'每個$'a \ n \ n \ n \ nb'> inputfile' –

回答

1

您正在致電getchar()兩次,它將讀取兩個不同的字符。在「K & R」代碼中,它們將getchar的結果存儲在變量中,因此可以在循環中對其進行分析。它的功能等同於:

char c = getchar(); 
while (c != EOF) 
{ 
    if (c == '\n') 
    { 
    ++nl; 
    } 
    c = getchar(); 
} 

printf("%d\n", nl); 
+0

@D斯坦利,謝謝,我已經意識到我的錯誤,我應該注意到它。 :( –

4

你在做什麼是你正在閱讀一個字符,並檢查它是否等於EOF。然後你正在閱讀另一個字符並將其與\n進行比較。這可能會也可能不會給你一個錯誤的答案,但方法是不正確的,有時會失敗。

在書中,他們讀了一個字符並將其存儲在一個變量c中,並檢查它是否爲EOF。然後他們將c\n比較,這是正確的方法。

+0

你在哪裏「閱讀另一個角色?」 – fvdalcin

+0

好吧,明白了。以爲你在談論K&R的版本... – fvdalcin

4

例如,如果第一getchar()讀取換行符和條件'\n !=EOF爲真,自帶內部環路

while(getchar() != EOF) 

     { 
     if(getchar() == '\n') // here reads next character that is not newline 
     { 
      counter += 1; // missed counting newline , which read by first `getchar()` 
     } 
    } 

正如你看到的上面的一個將無法正常工作。

+1

不錯。你選了一個好點。 – haccks

+0

感謝您的讚賞。 – Gangadhar

+1

@Gangadhar謝謝澄清,我看到我的方式的錯誤:( –

2

原因K & R使用變量是因此getchar()不是每次迭代調用兩次,每次調用getchar()時,都會改變輸入流的狀態。

1

爲了闡明Kunal的回答,你的版本只檢查每兩個字符中的一個字符的EOF /換行符,因爲第二個getchar()從文件讀取另一個字符。 K & R對每個角色都這樣。

+0

謝謝你qternion,我應該意識到這一點。愚蠢的錯誤。 –

1

getchar()返回標準輸入的下一個字符。

當你在if語句中調用它時,你會得到下一個字符,但是當你在「\ n」的檢查中再次調用它時,你會得到該字符後面的字符並進行比較,所以你實際上正在閱讀每次兩個字符,這是錯誤的。