TAKEAWAY 8.20 gets는 쓰면 안 된다.
다음 코드는 fgets와 같은 기능을 구현한 함수를 보여 준다.
예제 8-2 fgetc로 fgets 구현하기
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 }
이 경우도 기능을 보여 주기 위한 코드(오류 처리 방법을 보여 주기 위한 코드)이므로 기존 함수 대신 사용할 수는 없다.