getchar와 함께 터미널 드라이버가 어떻게 작동하는지 이해하려고합니다.getchar 버퍼 된 입력, EOF 및 터미널 드라이버
코드 1 : 여기 KandR을 읽는 동안 내가 쓴 몇 가지 샘플 코드입니다
#include <stdio.h>
int main(){
int c = getchar();
putchar(c);
return 0;
}
코드 2 :
#include <stdio.h>
int main(){
int c = EOF;
while((c=getchar()) != EOF){
printf("%c",c);
}
return 0;
}
코드 3 : // 베어 본 프로그램 화장실 명령의 기능을 에뮬레이트
#include <stdio.h>
#define IN 1
#define OUT 0
int main(){
//nc= number of characters, ns = number of spaces, bl=number of newlines, nw=number of words
int c = EOF,nc=0,nw=0,ns=0,nl=0, state = OUT;
while((c=getchar())!=EOF){
++nc;
if(c=='\n'){
++nl;
state = OUT;
}
else if(c==' '){
++ns;
state = OUT;
}
else{
if(state == OUT){
state = IN;
++nw;}
}
}
printf("\n%d %d %d %d",nc,nw,ns,nl);
return 0;
}
실제로 터미널 드라이버가 실제로 입력 문자열을 프로그램에 넘깁니다.
코드 2 출력 "t"(프로그램은 종료)
코드 1 내 입력을 가정하여 문자열 "이 테스트는"나는 여기에 전술 한 코드가 작동하는 방법이다 Enter 키이며 : "this is a test"를 출력하고 다음 줄로 건너 뜁니다 (입력 된 입력을 출력하기 때문에). 그리고 입력을 위해 다시 대기합니다.
코드 3 : 위의 문자열에 입력 한 다음에 아무 것도 출력하지 않습니다. 출력을 표시하려면 Ctrl + D를 누르십시오 (출력은 15 4 3 1입니다)
1) 왜 코드 3의 경우 입력이 명시 적으로 Ctrl + D (EOF)를 눌러야합니까? 내 프로그램에 보냈나요? 다시 말하면, 입력 1을 누른 후 코드 1과 코드 2의 경우 내 입력 문자열이 내 프로그램으로 전송 된 이유는 무엇입니까? 왜 EOF를 요구하지 않았습니까?
2) 또한 코드 3의 경우 입력 문자열 뒤에 enter 키를 누르지 않으면 Ctrl + D를 두 번 눌러 출력을 표시해야합니다. 왜 이런 경우입니까?
EDIT : 다른 입력 옵션
말하는 "테스트^D", 여기에서 상기 코드는 작동 방식이다
1) "T"를 출력하고
2)의 출력을 "끝나는 TESTING "을 입력하고 추가 입력을 기다립니다.
3) 다른 Ctrl + D를 누를 때까지 아무 것도 출력하지 않습니다. 이 결과는 7 1 0을 출력합니다.
이 입력의 경우, 코드 1과 코드 2의 경우 Ctrl + D를 수신하면 터미널 드라이버가 입력 문자열을 프로그램에 보냅니다. 이는/n과 Ctrl + D는 같은 방법으로 처리됩니다. 즉, 둘 다 터미널 드라이버가 입력을 프로그램에 보내는 표시 자 역할을합니까? 그렇다면 두 번째 경우에는 Ctrl + D를 두 번 눌러야하는 이유는 무엇입니까?
이 http://en.wikipedia.org/wiki/End-of-file은 줄 바꿈시 드라이버가 Ctrl + D를 EOF로 변환한다고 말합니다. 그러나 "TESTING^D"입력의 경우^D가 입력의 나머지 부분과 같은 행에 있더라도 정상적으로 작동합니다. 이것에 대한 가능한 설명은 무엇입니까?
마지막 질문에 답변 : 링크 된 Wikipedia 기사는 그것을위한 출처를 인용하지 않았습니다. 내가 기억하는 한,'ctrl' +'d'는 터미널 버퍼가 플러시되면'EOF'를 보내고, 그렇지 않으면 버퍼를 플러시합니다. 개행은 버퍼를 플러시합니다. 불행히도, 나는이 순간에 대한 참조를 찾을 수 없습니다. HTH – mafso
@mafso 정보를 제공해 주셔서 감사합니다. – Karan