1

fgets() を使用してファイルから行を読み取る関数を作成しようとしています。行を読み取った後、行を分解して小さな文字列にしたいと思います。行の最初の単語に応じて、私が読み取った行には、空白で区切られた 3 ~ 5 個の小さな文字列が含まれている可能性があります。

例: 行: Apple 12345 を削除 string1: string2 を削除: Apple string3: 12345

行: トマトの赤い葉を追加 string1: string2 を追加: トマト string3: 赤い string4: 葉

上記の例から、最初の文字列が削除された場合、他の 2 つの文字列 (apple、12345) を読み取る必要があります。最初の文字列が追加の場合、他の 3 つの文字列 (トマト、赤、葉) を読み取る必要があります。

とにかく、sscanfを使用して読み取りとこれを行う回数を決定できる方法はありますか?

while( fgets( buf, sizeof buf, course_file ) != NULL ){
    sscanf( buf, "%s", &string1);
    printf( "%s\n", buf );
} 

sscanf を使用することは必須ではありません。他の提案も受け付けています。

4

1 に答える 1

2

文字列をトークン化するために通常使用される関数は ですがstrtok、スレッドセーフではありません。その最新バージョンをstrtok_r代わりに使用する必要があります。

最初の呼び出しで のトークン化を開始bufし、最初のトークンを確認してから、最初のトークンの内容に応じていくつかのループのいずれかに進みます。

while( fgets( buf, sizeof buf, course_file ) != NULL ) {
    char *saveptr;
    char *tok = strtok_r(buf, " ", &saveptr);
    if (!strcmp(tok, "delete")) {
        for (int i = 0 ; i != 3 ; i++) {
            tok = strtok_r(NULL, " ", &saveptr);
            // Do something with the token...
        }
    } else if (!strcmp(tok, "add")) {
        for (int i = 0 ; i != 4 ; i++) {
            tok = strtok_r(NULL, " ", &saveptr);
            // Do something else with the token...
        }
    } else {
        // Error
    }
}
于 2012-09-30T03:00:43.277 に答える