0

OK、私は C でスペルチェック プログラムに取り組んでいます。ちょっと困っているのは、システム辞書からプログラムに単語を読み込むことです。私は答えを探しましたが、おそらくこれはかなり初歩的なことであるために、まったく正しいものを見つけることができませんでした. これが私がこれまでに得たコードです。

void readWord(FILE * stream, int buffer[]){
15   
16   while(fgetc(stream) != 10){
17     buffer[i] = fgetc(stream);              
18     printf("copying %d to buffer\n", buffer[i]);    //added for debugging
19   }
20   return;
21 }

呼び出しとともに関数呼び出しで使用される変数は次のとおりです。

int buffer[WIZE];
readWord(dictionary, buffer, WSIZE);

辞書は /usr/share/dict/words を指しており、正しく開くことを確認するコードがありますが、この質問には入れませんでした。結局それが問題なのかもしれません。これは Aarhus を出力するはずですが、代わりに次のように出力します。

Dictionary opened successfully
copying 97 to buffer
copying 104 to buffer
copying 115 to buffer

プログラムが 16 行目を実行するたびに、ファイルの位置が次の文字に更新されるのではないかと思っています。ポインタが 2 番目の文字から始まる場合、出力は Aarhus の 1 文字おきに表示されます。

readWord 関数は、チェックするテキスト ファイルから個々の単語を読み取るためにも使用されます。これが、getline を使用しなかった理由です。終端のヌル文字とともにバッファを文字列にフラッシュして表示する関数は他にもあります。これは、ファイルから一度に 1 つの単語を取得する処理を行うビットです。

4

4 に答える 4

0

ファイル ストリームから入力を読み取るには、getline を使用する必要があります。

于 2012-06-18T01:48:52.123 に答える
0

97a104forなどの文字コードですh。を使って文字として印刷してみてください%c

プログラムが 16 行目を実行するたびに、ファイルの位置が次の文字に更新されるのではないかと思っています。

文字をコピーするたびに、バッファreadWordのインデックス ( ) も更新する必要があります。改行を打ったらi、null で終了する必要もあります。ポータブルではありません。改行をチェックするときに使用します。buffer10\n

于 2012-06-18T01:48:58.830 に答える
0
while(fgetc(stream) != 10){

while 条件では、どこにも保存されていない文字を読み込んでいます。次に、本文で別の文字を読み取るため、反復ごとに 2 文字を読み取り、1 つだけを保存します。

また、文字を buffer[i] に格納していますが、i は増加していません。これを試して:

while((buffer[i] = fgetc(stream)) != 10){
     printf("copying %c to buffer\n", buffer[i]);    //added for debugging
     i++;
 }
于 2012-06-18T01:51:56.723 に答える
0

答えのおかげでうまくいきました。これが修正です

void readWord(FILE * stream, int buffer[]){
    unsigned short int i = 0;
    while((buffer[i] = fgetc(stream)) != '\n'){
            printf("copying %d to buffer\n", buffer[i]);
            i++;
    }
    return;
}

-そして出力

Dictionary opened successfully
copying 65 to buffer
copying 97 to buffer
...
Dictionary word is Aarhus
于 2012-06-18T02:03:15.637 に答える