1

私はCが初めてで、一度に1語ずつファイルを読み取る例をたくさん見ますが、テキスト行(実際にはファイル名のリスト)を指定して関数を作成しようとしています。一度に単語(ファイル名)。

例えば。この関数を words("file1.c file2.c file3.txt"); と呼びます。

そして、関数は各単語(ファイル名)を読み取り、それを別の関数に通す必要があります。

これまでのところ、私は持っています:

void words(char* line) {

    char buf[100];

    while (!feof(line)) {
        fscanf(line,"%s",buf);

        printf("current word %s \n", buf);  
    }
}

しかし、これはコンパイルされません。「互換性のないポインター型から 'feof' の引数 1 を渡しています」というメッセージが表示されます

編集これが私が思いついたコードです。words("test1 test2 test3 test4 "); で呼んだらうまくいきそうです。ただし、最後の文字がスペースでない場合、出力にエラーがあります。例 ("test1 test2 test3 test4");

char buf[100];
int word_length = 0;
int n;

while((sscanf(line + word_length,"%s",buf, &n)) == 1) {
    printf("current word %s \n", buf);  
    word_length = word_length + strlen(buf) + 1;
}

私が間違っていることは何ですか?

4

1 に答える 1

2

fscanfおよび関数はfeofファイルに対して機能します。

文字列に対応する関数はsscanf.

からの戻り値をsscanf使用して、文字列から何かをスキャンできたかどうか、および次の単語を文字列のどこまで探せばよいかを確認できます。

編集:

がんばれ。2つの問題が残っています。まず、単語間に複数のスペースがある場合、コードは失敗します。また、+ 1最後の単語の後にスペースがない場合は、ヌル ターミネータを超えて移動します。

2 番目の問題は、+1 を追加しないことで解決できます。つまり、前のアイテムが終了した直後に次のアイテムがスキャンされます。scanfは最初の空白をスキップするため、これは問題ではありません。

複数のスペースの問題は、次のトークンがstrstr.

ポインターを返すためstrstr、文字列の進行状況を追跡するために、インデックスの代わりにポインターを使用することに切り替えました。

char *ptr = line;

while((sscanf(ptr,"%s",buf)) == 1) {
    printf("current word %s \n", buf);
    ptr = strstr(ptr, buf);  // Find where the current word starts.
    ptr += strlen(buf); // Skip past the current word.
}
于 2013-10-08T08:13:04.510 に答える