2010-03-30 61 views
0

这是安全的吗? fgets是否终止缓冲区为空,或者我应该在调用fgets之后,还是在拨打clean之前将第20个字节设置为空?fgets()总是空终止它返回的字符串吗?

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

回答

3

fgets()总是正确地空终止缓冲区。从man page

与fgets()函数读取比Ñ来自给定流,并将它们存储在字符串小号中指定的字符数少至多一个。当发现 换行符时,在文件结束或错误时停止读取。换行符,如果有的话,保留。如果读取任何字符且没有错误,则会附加一个'\0'字符以结束字符串。

0

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