2014-06-15 10 views
1

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가 입력의 나머지 부분과 같은 행에 있더라도 정상적으로 작동합니다. 이것에 대한 가능한 설명은 무엇입니까?

+1

마지막 질문에 답변 : 링크 된 Wikipedia 기사는 그것을위한 출처를 인용하지 않았습니다. 내가 기억하는 한,'ctrl' +'d'는 터미널 버퍼가 플러시되면'EOF'를 보내고, 그렇지 않으면 버퍼를 플러시합니다. 개행은 버퍼를 플러시합니다. 불행히도, 나는이 순간에 대한 참조를 찾을 수 없습니다. HTH – mafso

+0

@mafso 정보를 제공해 주셔서 감사합니다. – Karan

답변

3

일반 정보 : 경우 코드 2에서

은 : 당신은 또한 종료하기 위해 D + Ctrl 키를 할 필요가있다.EOF는 Ctrl 키를 눌러 달성 사실

는 + D, 그래서 당신의 while 루프 조건은 말씀 :

  1. 입력이 등가가 아닌 경우 다
  2. 에 키보드
  3. 가게를 입력을받을 EOF는 while 루프의 본문을 실행합니다.

EOF는 정수 -1 뿐이며, ctrl + D를 눌러 단말기에서 수행 할 수 있습니다. 그래서이 예제를 복용 :

while((c=getchar()) != EOF){ 
    // execute code 
} 

printf("loop has exited because you press ctrl+D"); 

조건은 입력을 복용 유지하지만 당신은 Ctrl 키를 누르면 + D, 다음 코드의 나머지 부분을 계속 실행 중지합니다.

당신에게 응답 질문 :

1) 당사 코드 3의 경우 내가 내 프로그램에 전송 Ctrl 키 + D (EOF)을 명시 적으로 입력에 대한 눌러해야합니까? 다른 말로하면, 코드 1의 경우 내 입력 문자열을 내 프로그램으로 보내고 입력 한 후 2를 입력 한 이유는 무엇입니까? 왜 EOF를 요구하지 않았습니까?

코드 2와 3 (3 만 해당)에서 EOF를 읽은 경우에만 키보드에서 입력되는 while 루프가 중지되기 때문에 Ctrl + D를 눌러야합니다. 코드 1에서는 반복하지 않으므로 하나 이상의 문자를 입력하면 프로그램은 입력 된 문자를 읽지 만 처음 문자 만 저장 한 다음 인쇄하여 프로그램을 종료하므로이 경우 EOF가 필요하지 않습니다 왜냐하면 당신은 어떤 상황에서도 그것을 요구하지 않기 때문입니다.

2) 또한, 부호 (3)의 경우에는, 내가 누르지 않으면 입력 문자열 입력 후, 전 출력이 표시 될 두번 + D Ctrl 키를 누를 필요가있다. 왜 이런 경우입니까?

프로그램이 입력을 예상 할 때 입력을 시작한 경우 적어도 한 문자를 입력 한 후 Ctrl + D를 누르면 입력을 중단하고 입력 한 문자를 반환하도록 프로그램에 지시합니다. 그 후 문자를 입력하지 않고 ctrl + D를 다시 누르면 EOF가 반환되어 while 루프의 조건을 만족하지 않고 나머지 코드 실행을 계속합니다.

+0

나는이 질문을 편집했다. – Karan

+0

@Karan이 내 업데이트를 확인하십시오 – CMPS

+0

그래서 올바르게 이해하면/n과 Ctrl + D는 동일한 방법으로 처리됩니다. 즉, 둘 다 터미널 드라이버가 입력을 프로그램에 보내는 마커 역할을합니까? Ctrl + D 만 텍스트없이 혼자서 보내면 EOF로 취급됩니까? 코드 1 및 2 : 입력 후/n 또는 Ctrl + D를 누르면 입력이 putchar에 사용 가능하게됩니까? – Karan