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

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

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

是的fgets()总是正确地null终止缓冲区。 从手册页 :

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

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