그냥저냥

문제풀이 | The C Programming Language (K&R): Exercise 1-6 본문

개발기/The C Programming Language

문제풀이 | The C Programming Language (K&R): Exercise 1-6

sync86 2026. 5. 23. 15:01
728x90
반응형

책: The C Programming Language (K&R)

본문의 연습문제는 저작권 이슈로 그 내용을 직접적으로 언급하지 않습니다. 이점 양해 바랍니다.

 


Exercise 1-6. getchar() != EOF 확인하는 문제입니다.


1. 이 문제를 해결하는데 필요한 사전 정보

EOF (End of File)는 파일 끝을 의미합니다.

따라서 원래는 파일 입력을 받아야 하나, 책에서는 파일 입/출력을 하는 방법에 대해서는 언급하지 않았습니다.

때문에, UNIX의 기본 입출력 키보드 입력에 따라 파일을 입력해서 출력하는 방법으로 흉내를 내는 것 같습니다.

"모든 것은 파일이다."는 유닉스 철학이 있습니다. 이것은 키보드 입/출력력도 하나의 파일처럼 취급된다는 의미입니다.

운영체제마다 차이는 있겠지만, 키보드로 EOF를 표현하기 위한 방법은 아래와 같습니다.

  • 유닉스/리눅스: CTRL+D
  • 윈도우즈: CTRL+Z

2. 소스코드

#include <stdio.h>

/**
 * copy input to output; 2nd version
 */

int main(int argc, char** argv){

 int c = -1;

  while ((c = getchar()) != EOF)
  {
    putchar(c);
  }

  /* c가 EOF인지 확인하기 위한 코드 */
  if(c == EOF)
  {
    printf("%d %d\n", c, (c != EOF));
  }
}

3. 실행 및 검증

$ ./a.out # 엔터 입력 후 CTRL+D 입력
-1 0
$

4. 마무리

이 책에서 연습문제에서는 0 또는 1인지 확인하라고 적혀있습니다. EOF의 표준이 바뀌었던 것인지는 확실하지 않지만 -1이 맞습니다.

다만 원래 이 프로그램의 의도는 입력한대로 출력해주는 용도입니다.

파일을 복제하는 예제인 것이죠.

키보드를 입력하고, CTRL+D(유닉스/리눅스 기준) 입력하면 문자열이 출력되고 종료될 것으로 예상되지만, 대기중입니다.

이것은 출력 버퍼와 상관있는 이야기입니다.

$ ./a.out
I'm a boy.I'm a boy.

 

아직까진 이 이야기에 대해서 언급된 내용은 아닙니다.

정상 동작이라는 가정으로 CTRL+D (유닉스/리눅스 기준) 한번 더 입력하면 아래와 같이 프로그램이 종료됩니다.

$ ./a.out
I'm a boy.I'm a boy.-1 0
$

 

다음은 Exercise 1-7 풀어보겠습니다.

728x90
반응형