2016-02-07 90 views
-1

我有一個簡單的程序(基於C編程語言編輯2節1.5.2書中的例子)用於字符計數。該程序本身非常簡單,但我沒有得到期待的結果。C用於循環執行

看來,numberOfChars增加了兩次,我不是爲什麼......?

我使用的cygwin + gcc編譯器,請參閱圖像:compilation+test

int main() { 
    int numberOfChars; 

    for(numberOfChars = 0; getchar() != EOF; numberOfChars++) 
     ; //null statement 

    printf("Number of chars = %d\n", numberOfChars); 

    return 0; 
} 

感謝:-)

+2

對於空語句,使用'{}'而不是';'。因爲'for'循環後面的'''可能看起來像一個錯字,而當它是一個類型時,由於這個原因它是一個非常複雜的錯誤,因此一些編譯器會在你的代碼中發出警告。請張貼輸入,實際結果和期望的結果。 –

+3

請勿將文字作爲圖片發佈。相反,將文本複製/粘貼到問題中。 – fuz

+1

@Pavel getchar讀取包括新行字符的所有字符。所以如果你按Enter鍵,那麼'\ n'也被計算在內。 –

回答

0

任何幫助,爲了得到一個3,你可以寫:

#include <stdio.h> 

int main() { 
     int numberOfChars = 0; 

     do { 
       while(getchar() != '\n') 
         numberOfChars++; 
     } while(getchar() != EOF && numberOfChars++); 

     printf("Number of chars = %d\n", numberOfChars); 

     return 0; 
} 

然後按Ctrl + D退出嵌套循環。

事實上,你的程序是正確的。它給了你6,因爲你輸入了6個字符:1,\n,2,\n,3,\n

+1

這是一個不可思議的代碼,沒有通過省略外部'do ... while'循環體的括號來實現。如果循環體本身是一個複合語句(比賦值或函數調用更復雜)使用大括號。我可以看到代碼是如何工作的。我不確定代碼是否是有用的修改。它也不計算額外的換行符,所以它給出了錯誤的答案。向代碼發送EOF指示也會將其發送到一個tizzy。 –

+0

@JonathanLeffler改進,看起來更好? –

+1

不止一次調用getchar是非慣用的C,提問者只需要在一個文件上運行該程序,他可以使用'od -c'來檢查該文件以避免混淆 – Rob11311

0

創建一個文件,然後運行cygwin的OD程序,其次是C範例程序運行:

od -x < testfile 
a.out < testfile 

然後你就可以看到你的文件中有什麼&多少個字準確,避免意外。

輔助調試,如果我懷疑是出事了,我想補充喜歡的事:

int c; for(numberOfChars = 0; (c = getchar()) != EOF; numberOfChars++) 
    printf("\0x%x", c); 

要理解我的代碼是做處理。