这样做安全吗? 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;
}
答案 0 :(得分:4)
是fgets()
始终正确地为空终止缓冲区。来自man page:
fgets()函数从给定的流中读取的内容最多比 n 指定的字符数少一个,并将它们存储在字符串 s < / em>的。阅读停止时 在文件结尾或错误处找到换行符。保留换行符(如果有)。如果读取任何字符且没有错误,则表示“
\0
”字符 附加以结束字符串。
答案 1 :(得分:0)
如果有错误,fgets()可能会也可能不会在缓冲区中的任何位置存储任何零字节。不检查fgets()返回值的代码是不安全的,除非它确保缓冲区中的某个位置为零;最简单的方法是无条件地将零存储到最后一个位置。这样做意味着一个未被注意的错误可能(取决于实现)导致一个虚假的额外数据行被读取,但不会落入未定义的行为。