0

test.txt:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccccccccccccc
The color of the car is blue

コード:

FILE *fp;
char var[30];
int result

if( (fp = fopen( "test.txt", "r")) == NULL)  //open for read
    printf("ERROR");


result = fscanf( fp, "The color of the car is %s", &var);

これが実行された後:

ファイルを開きます(NULLではなく、テスト時に追加を実行できました)
result = 0 //ゼロ-一致する失敗の場合....?
errno = 0;
varはガベージです。

fscanf()が「青」と一致することを期待していました。

どうすれば青をvarに正しく入れることができますか?ありがとうございました。

4

5 に答える 5

4

fgets代わりに使用するのはどうですか?

char *search = "The color of the..";
char *p;
while (fgets(var, SIZE, stdin)) {
    /* Does it have what we want ? */
    if ((p = strstr(var, search)))
        break;
}

if (p)
    p += strlen(str);
于 2012-08-28T20:32:32.027 に答える
1

Fscanfはこのようには機能しません。文字列を調べたりスキャンしたりして、一致するものを探すことはありません。フォーマット指定子と完全に一致する文字列を指定する必要があります。だからあなたは次のようなことをすることができます

result = fscanf(fp, "aaaaaaaaaaaaa\nbbbbbbbbbbb\ncccccccccc\nThe color of the car is %s", &var);

あなたが望むものを達成するために。

于 2012-08-28T20:31:37.807 に答える
1

charへのポインタを渡す必要があるのに、charの配列へのポインタをに渡すというバグがありますfscanf。たまたま配列のアドレスが配列の最初の要素のアドレスと等しいので、偶然に機能します。しかし、間違ったタイプが渡されています。

さらに、一致を提供する行を見つけたいと考えており、に格納"blue"したいと考えているようですvar。これを行うには、入力行がスキャンパターンと一致するかどうかをテストする必要があります。を使用fgetsして行を読み取り、を使用sscanfして行をスキャンできます。

while (fgets(buf, sizeof(buf), fp) != 0) {
    result = sscanf(buf, "The color of the car is %s", var);
    if (result == 1) break;
}

sscanf正常にスキャンされたディレクティブの数を返します。この場合、1つの%sディレクティブがあります。

このようにすることで、スキャンエラーが入力解析を「妨害」するのを防ぎます。つまりfscanf、エラーが返された場合、を呼び出すまで、エラーの原因となった入力を超えて移動することはできませんclearerr()

于 2012-08-28T20:42:38.203 に答える
1

ここに別のバグがあります。test.txtが存在しない場合、コードは先に進み、とにかくfscanfを使用するため、チェックが役に立たなくなります。これにより、ほぼ確実にプログラムがクラッシュします。

于 2012-08-28T20:48:56.317 に答える
1

正規表現を使用する

char p[100];
char q[100];
char r[100];
fscanf(fp, "%[^\n]\n%[^\n]\n%[^\n]\nThe color of the car is %s",p,q,r, &var);

要件に応じて変更してください。私はこれがあなたの実際の文字列ではないことを知っています。

于 2012-08-28T20:50:28.737 に答える