0

私の仕事は、前のものの特定のシーケンスの後の単一の単語を省略することになっているプログラムを書くことです。私はすでに作業中の getword プロシージャを準備しました (戻り値char *)。今は、次のコード スニペットがある main に問題があるだけです。これにより、どこで単語を削除する必要があるかを検出できます。しかし、出力ファイルからその単語を実際に省略/削除する方法がわかりません。

int main(int argc, char **argv)
{
    FILE *infile = NULL, *outfile = NULL;
    char *word = NULL;
    int c;
    int yes = 0;
    int counter = 0;

    /* completely irrelevant - opening, writing to files, error messages etc. */
    while (1) {
        c = fgetc(infile);

        word = getword(infile);
        if (counter == 2) {
            counter = 0;
            yes = 0;
                    /* here it should somehow omit the word */
            continue;
        }
        if (choose(word, strlen(word))) {
            fputs(word, outfile);
            counter++;
            yes = 1;
        } else {
            fputs(word, outfile);
            if (yes == 1) {
                counter--;
            }   
        }
        free(word); 
    }
    /* completely irrelevant */
}   

編集:明確にするために追加

「getword は単語を読み取るだけで、探している単語であるかどうかのチェックは実行しません。main() がそのチェックを行います。if (選択) が満たされると、単語に一連の文字 I が含まれていることを意味します。 ''' を探しています, そしてその特定の単語の後の 2 番目の単語は省略されるべきです. 変数 "counter" と "yes" は完璧なアルゴリズムではないかもしれません. 「Counter」は、省略される単語を決定するために 2 までカウントし、「yes」は、if (choose)条件を満たさない単語に移動した後にカウンターをインクリメントするのに役立ちます。

前もって感謝します!

4

2 に答える 2

1

その単語を出力ファイルから削除しないでください。入力ファイルから省略する必要があります。

word = getword(infile);

ここで、省略しなければならない単語が得られると思います。ではない?この単語の長さを取得して、次のサイクルを実行できます

int len = strlen(word); 
for (int i=0; i<=len; i++) 
   fgetc(infile); //we also omit the special char

この瞬間から、続けることができます。

編集:チェックしていると思います

if(!isalpha(c)) 

スペースはアルファベットではないので良くありません。この変種の方が良いかもしれません

if (c!='\\') 

この場合、文字「\」は特殊文字です。

于 2012-08-24T13:27:37.717 に答える
0

わかった、代わりに

/* here it should somehow omit the word */

あるはずですfree(word);

すべてが魅力のように機能します。以前に入手しましたが、自分の質問への回答を投稿するのを忘れていました:D

于 2012-08-26T15:26:18.690 に答える