1

这样做安全吗?是fgets用 null 终止缓冲区还是应该在调用之后和调用fgets之前将第 20 个字节设置为 null ?clean

// 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()总是正确地以空值终止缓冲区。从手册页

fgets()函数最多从给定流中读取比n指定的字符数少 1 的字符,并将它们存储在字符串s中。当发现换行符、文件结尾或错误时,读取停止。保留换行符(如果有)。如果读取了任何字符并且没​​有错误,\0则会附加一个 ' ' 字符来结束字符串。

于 2010-03-30T17:00:44.343 回答
0

如果出现错误, fgets() 可能会也可能不会在缓冲区的任何位置存储任何零字节。不检查 fgets() 的返回值的代码是不安全的,除非它确保缓冲区中某处的值为零;最简单的方法是无条件地将零存储到最后一个位置。这样做意味着一个未被注意到的错误可能(取决于实现)导致读取虚假的额外数据行,但不会陷入未定义的行为。

于 2015-03-24T22:50:52.813 回答