fgets() 是否总是以 null 结尾它返回的字符串?

use*_*033 2 c file-io fgets

这样做安全吗?是否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;
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 6

是的fgets(),总是正确地以空值终止缓冲区。从手册页

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