2016-03-31 35 views
2

K & R的「C語言程序設計語言」第1-13題要求讀者創建一個程序,該程序將按單詞的長度製作單詞的直方圖。這些詞將由用戶輸入。奇特的結果。 #1-13 The C Programming Language Book

我試圖創建一個程序,它將存儲每個長度的多少個單詞,然後在處理直方圖之前打印出每個數組塊的整型值。無論我如何擺弄這個節目,它總會給我兩個結果中的一個;要麼是「1」,要麼我認爲是一個數組地址? 「6422476」。這是爲什麼發生?

#include <stdio.h> 
#define GREATEST 10 

int main(void){ 
    int c, word=0; 
    int word_count[GREATEST]; 

    /*set all values in word_count to 0*/ 
    for(int i=0; i<GREATEST; i++){ 
     word_count[i]=0; 
    } 

    while((c=getchar()) != EOF){ 
     if(c != ' '){ 
      ++word; 
     } else{ 
      word_count[word-1]=+1; 
      word=0; 
     } 
    } 

    for(int j=0; j<GREATEST; j++){ 
     printf("\n%d", word_count[j]); 
    } 
    return 0; 
} 
+2

1)您可以通過只是在做擺脫第一循環的' int word_count [GREATEST] = {0};'2)'word_count [word-1] + = 1;'如果'word'等於'0',比如說第一個字符輸入是空格, 3)你從不計數最後的單詞; 4)你的字數會包括換行符,句點和其他非字母字符。 –

+0

@Paul Griffiths我唯一的問題是你的第三點,不會 for(int j = 0; j Dynathus

+0

該循環打印直方圖,它與計算單詞無關。當你遇到一個空間時,你只會計算一個單詞。除非你讀的最後一個字符是一個空格,'word_count [word-1] + = 1;'不會被執行到最後一個單詞,所以它不會被計算。 –

回答

2

有一個很好的理由,爲什麼你會永遠得到1.遵守該

word_count[word-1]=+1; // This assigns to the value "+1"!` 

應該

word_count[word-1]+=1; // This increments your array item` 

這是一個雞姦什麼用C編譯:)。

+0

'= +'在古代C中曾經是一個操作符!而且,這些運算符可能曾經以'+ ='的形式寫入空格。 – Kaz

+2

請參閱:https://www.bell-labs.com/usr/dmr/www/chist.html Quote: *「在B和早C,操作員拼寫= +而不是+ =;這個錯誤,在1976年修復,是通過處理B的詞法分析器中的第一種形式的誘人簡單方法誘導的。「*直接來自Dennis Ritchie。 – Kaz

+0

這是有道理的,但那麼它爲什麼不會是 .... 你的圖片 – Dynathus

0

我跑你的代碼或者正確+=或「不正確」 =+兩者給出了相同的輸出:

a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee 

1 2 3 4 0 0 0 0 0 1 

a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee 

1 2 3 4 0 0 0 0 0 1 

但是都下降進入了最後一個字 - 零5個字符的長度字。我認爲這是因爲你退出EOF上的while循環,比如ctrl + D,以及自從最後一個空間' '沒有處理以來輸入的內容。

此外,如果用戶在多行上輸入空格分隔的「單詞」或「單詞」組,結果不正確。這些用於輸入單詞的「選項」使得難以一致地處理輸入。

您可能會更好地指導用戶每次輸入一個單詞並拒絕包含空格的輸入。 這樣可以更輕鬆地控制輸入並處理所有輸入的單詞。

以下是使用緩衝區保存輸入的輸入代碼片段。 緩衝區大小,直方圖數組和最大允許字長均使用靜態變量maxlen進行設置。

/* tell user what to enter */ 
printf("Type one word at a time (hit enter after each word)\nType 99 to finish\n"); 

/* get lines of input */ 
while ((fgets(buff, maxlen ,stdin)) != NULL) { 
    /* test for '99' end code */ 
    if(strncmp(buff, "99", 2) == 0) break; 
    /* test for any spaces in input -if so ignore input & print message */ 
    if(strstr(buff, " ") != NULL) { 
     printf("Enter one word at a time - then hit enter\n"); 
     } else { 
     /* else get size of word (-1 for newline) & increment appropriate counter */ 
     length = strlen(buff) - 1; 
     hist[length]++; 
    } 
} 

的緩衝液設置這樣

char *buff = malloc(maxlen + 1); 

,必須free'd一旦輸入完成

free(buff);