2

更新:文字列をで適切に初期化char string[sizeof buffer - 1]することでクラッシュの問題は解決しましたが、複数の句読点があることがそれと何の関係があるのか​​についてはまだ興味があります!

「テキスト」の形式でファイルから文字列を読み取ろうとしています。sscanfこれまでのところ、パターンでの使用\"%[^\"]\"は完璧に機能しましたが、文字列に句読点を追加し始めるとすぐに、プログラムがクラッシュし始めました。

エラーは、句読点が何であるか、またはマークの位置に関係なく、複数の句読点が使用されている場合にのみ発生するようです。また、ファイル内の句読点のある行の位置に関係なく発生します(つまり、最後の行に句読点がない場合でも、エラーが発生します)。

とにかく、以下は私がこれまでに持っているコードです:

char* func(char* f_name);
    FILE* file = get_file(f_name,"r"); // a short function I wrote to get the
                                       // file pointer from the current
                                       // directory. The error is almost
                                       // certainly not here.
    if (file == 0) {
        print("Unable to load file\nExiting...");
        exit(-1);
    }

    char* pattern = "\"%[^\"]\"";
    int read_args = -1;
    char* string; //  string size is unknown until read
    char buffer[1200]; // i expect very long line of data in the file

    while ( fgets( buffer, sizeof(buffer), file ) != NULL ) {
        printf("found line: %s\n",buffer);
        read_args = sscanf(buffer, pattern, string);
        printf("num args: %d\n",read_args);
        printf("read value: %s\n", string);
    }

    fclose(file);
    return string;
}

以下は私が試したいくつかのデータです。「失敗」とマークされている場合、プログラムはコンパイルされ、すべてが実行され、終了する直前にクラッシュします。

"test test test" // successful
"test, test test" // successful
"test test; test" // successful

"test, test, test" // unsuccessful
"test; test. test," // unsuccessful

%d \"%[^\"]\" \"%[^\"]\"この問題が解決され、このエラーが発生する前にパターンを使用してデータを正常に読み取っていた場合は、より複雑なパターンを使用する予定です。回答をよろしくお願いします。

4

1 に答える 1

3

ランダムメモリにスキャンしているため、コードは未定義動作を呼び出します。

string変数が初期化されることはないため、によって書き込まれる文字列の宛先はsscanf()未定義です。

あなたは例えば必要です

char string[sizeof buffer - 1];

常にクラッシュするとは限らないという事実は幸運であり、コードは常に未定義の動作を呼び出しています。句読点を使用すると、例に基づいて、スキャンされたテキストが長くなり、より多くのメモリが上書きされ、十分に重要なものにヒットすると最終的にクラッシュがトリガーされた可能性があります。

于 2012-01-14T17:24:55.277 に答える