2011-10-31 112 views
0

僅供參考,我在The C Programming Language, Second Edition中複製此示例(幾乎)來自第18頁的信件。for循環不執行循環外的任何指令

#include <stdio.h> 
/*count characters in input, 2nd version*/ 
main(){ 
    double n; 
    for (n = 0; getchar() != EOF; ++n) 
     ; 
    printf("%.0f\n", n); /*this never prints*/ 
} 

我不知道這是否是我的版本的gcc(我是小白):

% gcc --version 
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 
Copyright (C) 2010 Free Software Foundation, Inc. 

因爲

for (n = 0; getchar() != EOF; ++n) 
    printf("%.0f",n); /*returns...n*/ 

我試着打印 「富」,而不是值n,只是爲了看。它仍然沒有打印。

我在這裏錯過了什麼?我不喜歡前進,而忽略像這樣的小問題。

=====================================

編輯

所以,最終的結果應該是:

% gcc ./counter.c -o ./counter 
% ./counter 
foo 
3 

眼下,這是從第一段的輸出結果:

% ./counter 
foo 

,第二個:

% ./counter 
foo 

^C 
% 
+1

您期望它做什麼?它應該計算你輸入一個字符的次數,然後打印出這個數字,如果我理解正確的話 –

+2

除了'for'行末尾的';'不應該在那裏,你必須在控制檯中輸入一個字符,並且每次執行'for'循環時按Enter鍵,因爲在用戶輸入字符並按下Enter鍵後,getchar不會返回。 –

+0

你爲什麼用'double'來計算字符數?一個'unsigned long'將會大得多(除非你正在給你的程序提供多GB的輸入文件)。順便說一句,你通常不應該在你的問題中包含答案;這是(接受的)答案的目的。 –

回答

3

如果您在OSX或Linux機器上,則需要在其自己的行上鍵入Ctrl+D以生成EOF 字符 。在Windows上,Ctrl+Z在自己的線上。不要在unix盒子上輸入Ctrl+Z,因爲這隻會將您的過程發送到後臺。

您正在輸入Ctrl+C這是中斷,並會發送一個SIGTERM到您的程序。

我的Mac上,我得到:

$ ./foo 
hello 
6D 

或者,如果你不想信號EOF條件,使用echo和管道:

$ echo "hello" | ./foo 
6 

注意,EOF有在自己的路線上。一個^D被打印,然後6覆蓋^,所以它看起來像輸出是6D

當然,在上面的兩個例子中,被計數的字符是h e l l o \n。如果您不想換行,請執行以下操作:

$ echo -n "hello" | ./foo 
5 
+0

沒有EOF字符。這是IO庫用於信號傳輸的特殊值。該值通常爲-1,如果該類型未簽名,則該值甚至不能表示爲「char」。 Ctrl-D和Ctrl-Z用於向shell發送完成信號。 –

+0

你是對的,我已經更新了我的答案。您仍然需要發送EOF信號來終止OP的循環,而不會過早結束該過程。 – ObscureRobot

+0

這是真的。我不知道ctrl + d強制使用EOF。我無法以任何其他方式讓它工作......雖然我不喜歡它。我會暫時忽略這個特點......謝謝。 – Droogans

1

您應該在for之後沒有該分號。這意味着你的循環中唯一的東西是一個空的陳述。

其實大衛是對的。空的語句循環中唯一的東西,但沒關係。它會計算字符的數量。然後,外部的循環,它將打印總數。

demo表明它按預期工作(6字符輸入結果打印6)。但是,爲了清晰起見,我會使用大括號,或保留原始縮進。

+2

如果您只打印總字符數,而不是打印數,則需要使用分號。看起來問題在於用「通常」地方的分號(用於打印計數)表示它的工作原理,但在不尋常的地方使用分號(僅打印總數),事實並非如此。 –

+0

@Matthew,是的,但是如果我在那裏打印「foo」會發生什麼?我會得到[foo]的[n]次出現。我正在一條線上尋找最終結果。 – Droogans