2016-07-31 13 views
0

在學校相當多的幾年後,我重新開始編碼,並且我試圖在C中編寫一個程序文本中有多少個n字母單詞,將它們存儲到一個長度爲n的數組中,然後將它們打印出來。爲了保持簡單,我假定n是b/w 1和10,每個單詞由一個空格分隔。C程序用於計算嵌套在while循環中的文本中的n個字母單詞的數量

下面是代碼,但是,似乎我的程序永遠不會從內部while循環中跳出,因此屏幕上不會顯示任何內容。我試圖在該循環的末尾打印一些東西來測試它,出於某種原因,程序打印的次數與有字符(包括空格,內部條件應該捕獲並退出)的次數相同。我在這裏忽略了什麼嗎?

main() 
{ 
int c, i, j, counter; 
counter = 0; 
int wlength [10]; 
for (i=0; i<10; ++i) //initialize array 
    wlength[i]=0; 
while((c=getchar())!=EOF){ // keep taking input until end of file 
    while (c!=' '){ //keep counting until you reach the end of the word 
     ++counter; 
     c=getchar(); 
    } 
    wlength [counter-1]++; //increment the counter for that word length 
    counter=0 ; //reset the counter for the next word 
} 
for (j=0;j<10;++j) //print the array 
    printf("%d ", wlength[j]); 
+0

您需要測試EOF。你只在外環測試。 – stark

+1

是不是每行的最後一個字符是換行符(\ n還是\ r \ n)? – Roger

+0

嘗試'while(c!=''&& c!='\ n'&& c!= EOF){'而不是'while while(c!=''){' – BLUEPIXY

回答

0

你有兩個循環讀取標準輸入,只有一個檢查EOF。因此,如果在文件結束之前沒有正好的空格,程序將讀取該文件並卡住。 你會只用一個循環更好,由if - else聲明置換其他:

Pseudo-code : 
while (getchar and !EOF) 
{ 
    if (char isn't a space) 
    { 
     increment counter 
    } else { 
     increment value for given length 
     set first counter to 0 
    } 
} 

您也應該檢查你在數組的邊界是......詞像「expotentially`存在; - )

+0

感謝您的幫助!是的,似乎我忘記在內部循環中添加對EOF和換行符的檢查。 if-else語句選項也是一個很好的選擇(正如顯而易見的那樣!!):) – MMD00D

0

問題是inner while loop。因爲在unix或unix系統中。每行的末尾是\n。所以你的代碼在第一個內部循環中被阻塞。你需要添加更多的檢查。測試條件應改爲:

while(c != ' ' && c != '\n'){ 
    ++counter; 
    c=getchar(); 
} 

而我運行它,它的工作。

+0

是的,那就是我們所說的;-)但是,要明白文件通常可以很容易地包含一個CR + LF(\ r \ n) 。所以這個代碼是不夠的...... – Roger

+0

@Rogier Windows在行尾使用'CR + LF'。如果你在Windows上有'mingw'或'cygwin'。可以使用'dos2unix'命令來轉換它。但考慮更便攜,條件可能需要添加更多。 –

+0

是的,謝謝!好像我忘記了內部while循環中的新行和EOF條件。我應該指定我正在使用Windows機器並在IDE(代碼::塊)中運行它。 – MMD00D