2010-03-30 3 views
0

안전한가요? fgets은 null로 버퍼를 종료합니까? 아니면 fgets을 호출 한 후 그리고 clean을 호출하기 전에 20 번째 바이트를 null로 설정해야합니까?fgets()는 항상 반환하는 문자열을 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; 
} 

답변

3

fgets() 항상 버퍼가 널 종료됩니다. man page에서 :

는 fgets()는 함수는 문자열 에 지정된 스트림 저장을에서 N에 의해 지정된 문자의 수보다 많아야 하나 덜 읽습니다. 파일 끝 또는 오류시에 개행 문자가있는 경우 읽기가 중지됩니다. 개행 문자가있는 경우 그 개행 문자가 유지됩니다. 문자를 읽고 오류가없는 경우 '\0'문자는 문자열 뒤에 추가됩니다.

0

오류가있는 경우 fgets()는 버퍼에 0 바이트를 저장할 수도 있고 저장하지 않을 수도 있습니다. fgets()의 반환 값을 검사하지 않는 코드는 어딘가에 버퍼에 0이 존재하지 않는 한 안전하지 않습니다. 가장 쉬운 방법은 무조건 마지막 자리에 0을 저장하는 것입니다. 이렇게하면 눈에 띄지 않는 오류가 구현에 따라 가끔씩 추가 데이터 행을 읽을 수는 있지만 정의되지 않은 동작으로 떨어지지는 않습니다.

관련 문제