fgets()总是以null方式终止它返回的字符串吗?

时间:2010-03-30 16:59:36

标签: c file-io fgets

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

// 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;
}

2 个答案:

答案 0 :(得分:4)

fgets()始终正确地为空终止缓冲区。来自man page

  

fgets()函数从给定的流中读取的内容最多比 n 指定的字符数少一个,并将它们存储在字符串 s < / em>的。阅读停止时        在文件结尾或错误处找到换行符。保留换行符(如果有)。如果读取任何字符且没有错误,则表示“\0”字符        附加以结束字符串。

答案 1 :(得分:0)

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