1

これは安全ですか?fgetsバッファをnullで終了しますか、それとも呼び出し後および呼び出し前に20バイト目をnullに設定する必要がありますfgetsclean

// strip new lines
void clean(char *data)
{
    while (*data)
    {
        if (*data == '\n' || *data == '\r') *data = '\0';
        data++;
    }
}

// for this, assume that the file contains 1 line no longer than 19 bytes
// buffer is freed elsewhere
char *load_latest_info(char *file)
{
    FILE *f;
    char *buffer = (char*) malloc(20);
    if (f = fopen(file, "r"))
        if (fgets(buffer, 20, f))
        {
            clean(buffer);
            return buffer;
        }
    free(buffer);
    return NULL;
}
4

2 に答える 2

4

はいfgets()、常に適切にnullを終了します-バッファを終了します。マニュアルページから:

fgets()関数は、指定されたストリームからnで指定された文字数より多くても1つ少ない文字を読み取り、それらを文字列sに格納します。ファイルの終わりまたはエラーで改行文字が見つかると、読み取りが停止します。改行がある場合は保持されます。いずれかの文字が読み取られ、エラーがない場合は\0、文字列を終了するために''文字が追加されます。

于 2010-03-30T17:00:44.343 に答える
0

エラーが発生した場合、fgets()はバッファ内のどこにもゼロバイトを格納する場合としない場合があります。fgets()の戻り値をチェックしないコードは、バッファーのどこかにゼロがあることを確認しない限り、安全ではありません。これを行う最も簡単な方法は、最後のスポットにゼロを無条件に格納することです。これを行うと、気付かれないエラーが(実装によっては)偽の余分なデータ行を読み取る可能性がありますが、未定義動作に陥ることはありません。

于 2015-03-24T22:50:52.813 に答える