2016-03-31 5 views
2

「The C Programming Language」の質問1-13は、K &によって作成されました。Rは、長さで単語のヒストグラムを作成するプログラムを作成するよう読者に依頼します。単語はユーザによって入力されるべきである。特有の結果。 #1-13 The C Programming Language Book

私はヒストグラムを扱う前に、それぞれの配列ブロックのint値を出力する各長さの単語の数を格納するプログラムを作成しようとしました。どんなに私がこのプログラムで何かをしていても、それは常に私に2つの結果のうちの1つを与えます。 "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)あなたは、単に実行して最初のループを取り除くことができます '最初の文字入力がスペースであれば、word_countは{0}; {2} 'word_count [word-1] + = 1;'は 'word'が' 0 ' 3)あなたは決して最後の言葉を数えません。 4)改行、ピリオド、その他の文字以外の文字を単語数に含めます。 –

+0

@Paul Griffiths私の唯一の質問は、3番目の点です。 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"!` 

それはC :)にコンパイル何時間を浪費だ

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

なければならないことを確認して取得したい理由は正当な理由があります。

+0

'= +'は古代Cのオペレータとして使われました!また、これらの演算子は、以前は、 '+ ='のように空白で書かれていました。 – Kaz

+2

ここをクリックしてください:https://www.bell-labs.com/usr/dmr/www/chist.html引用: *「Bと初期のCでは、オペレータは+ =の代わりに+ +;この間違いは、 1976年に修理されたのは、Bの字句解析装置で最初のフォームを扱うことの魅惑的に簡単な方法によってもたらされたものです」* Dennis Ritchieのストレート。理にかなっているが、その後、なぜそれが ことwouldntの – 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文字の長さの単語のためのゼロ。これは、ctrl + DのようなEOFのwhileループを終了し、最後のスペース' 'が処理されていないので入力されたものであると考えます。

また、ユーザーが複数の行にスペースで区切られた「単語」または「単語」のグループを入力すると、結果が正しく表示されません。単語を入力するためのこれらの「オプション」では、入力を一貫して処理することが難しくなります。

一度に1語を入力し、スペースを含む入力を拒否するようにユーザーに指示する方がよい場合があります。 これにより、入力を制御して入力されたすべての単語を簡単に処理できます。

入力を保持するバッファを使用した入力用のコードスニペットです。 バッファサイズ、ヒストグラム配列、および最大許容ワード長はすべて、静的変数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);