2012-09-02 14 views
2

저는 Kernighan과 Ritchie가 The C Programming Language를 읽었으며 아주 초기에 책에서 직접 복사 했더라도 작동하지 않는 프로그램을 발견했습니다. 여기에 설명의 화면 캡이 있습니다 - http://i.imgur.com/SBQSE.png이 프로그램은 어떻게 작동합니까?

내가 입력 한 내용은 분명 키보드 입력이며 키보드 입력이 아닌 EOF를 체크하고 있기 때문에 무한 루프에 빠지게됩니다.

#include <stdio.h> 
/* copy input to output; 1st version */ 
main() 
{ 
    int c; 
    c = getchar(); 
    while (c != EOF) { 
     putchar(c); 
     c = getchar(); 
    } 
} 

확실한 C 책에는 오류가 없어야합니다. 뭔가 빠졌습니까?

답변

4

명령 줄에서 읽을 때 EOF (파일 끝) 신호를 보내려면 ctrl + d을 사용하십시오.

파일에서 바이트 스트림을 읽는 경우 파일에있는 바이트 스트림을 자동으로 읽을 수 있습니다. 그러나 명령 행에서 읽는 중이므로 위의 키 순서를 사용하여 수동으로 파일 끝을 알릴 필요가 있습니다.

실제로 EOF는 일반적으로 나타내는 -1에

이 0이 아닌 값이 true이기 때문에 그냥 while(c) { do work; } 말할 수없는 이유이다 (적어도 glibc가) 작동 방법 - 따라서 EOF가 참, getchar()에 대한 호출로 반환 된 다른 양수 문자와 같습니다. 따라서 ctrl + d과 함께 EOF 신호를 보낼 때 스트림에 나타나는 c != EOF 코드와 C가 EOF (-1)를 비교하는지 직접 확인해야합니다.

+3

Windows의 경우 Ctrl + Z, iirc입니다. –

+0

또한 올바르게 기억하고 변경되지 않은 경우 Windows 및 DOS에서 ctrl-Z가 스트림의 실제 문자로 배치됩니다. Unix에서 ctrl-D는 실제로 문자로 보내지지 않으며 파일의 끝을 의미하지는 않습니다. 즉, flush를 의미합니다. 그게 내가 http://stackoverflow.com/questions/1516122/how-to-capture-controld-signal에 쓴 것입니다 ... –

+1

감사합니다,'ctrl + d'이 트릭을했습니다! 'Ctrl + Z'가 작동하지 않았습니다. –

2

EOF는 파일 끝입니다. Ctrl-D를 시도하십시오.

+2

가장 적합한 운영 체제에서는 Ctrl-D를 사용하십시오. –

+1

Ctrl + C는 Ctrl + D와 다른 기능을 수행합니다. – Makoto

+0

하하. 방금 기억하고 편집했습니다. "적절한"OS로 간주되는 것은 무엇입니까? –

관련 문제