더북(TheBook)

TAKEAWAY 8.20 gets는 쓰면 안 된다.

다음 코드는 fgets와 같은 기능을 구현한 함수를 보여 준다.

 

예제 8-2 fgetcfgets 구현하기

 1 char* fgets_manually(char s[restrict], int n,
 2                      FILE*restrict stream) {
 3   if (!stream) return 0;
 4   if (!n) return s;
 5   /* 최대 n-1개 문자를 읽는다. */
 6   for (size_t pos = 0; pos < n-1; ++pos) {
 7     int val = fgetc(stream);
 8     switch (val) {
 9       /* EOF는 파일 끝(end-of-file) 또는 오류를 의미한다 */
10     case EOF: if (feof(stream)) {
11       s[i] = 0;
12       /* 유효한 호출이었음 */
13       return s;
14     } else {
15         /* 오류 */
16         return 0;
17       }
18       /* EOL에서 멈춘다. */
19       case '\n': s[i] = val; s[i+1] = 0; return s;
20       /* 나머지 경우에는 그냥 값을 대입하고 계속 실행한다. */
21       default: s[i] = val;
22     }
23   }
24   s[n-1] = 0;
25   return s;
26 }

이 경우도 기능을 보여 주기 위한 코드(오류 처리 방법을 보여 주기 위한 코드)이므로 기존 함수 대신 사용할 수는 없다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.