2016-10-17 2 views
0

문제 공간 :사용자 정의의 getline() 구현 - while 루프 내부

어떻게 그것이 while ((len = _getline(line, MAXLEN)) > 0)_getline(...) 증가 내부 i을 것이라고하지만 누를 enter key 때까지 결과를 인쇄하지?

코드 예 :

#include <stdio.h> 
#include <string.h> 

#define MAXLEN 1000 

int _getline(char s[], int max) 
{ 
    int c, i, l; 

    for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) { 

     printf("%d\n", i); 

     if (i < max - 1) { 
      s[l++] = c; 
     } 
    } 

    if (c == '\n' && l < max - 1) 
     s[l++] = c; 

    s[l] = '\0'; 
    return l; 
} 

int main() 
{ 
    int len; 
    char line[MAXLEN]; 

    while ((len = _getline(line, MAXLEN)) > 0) 
     ; 

    return 0; 
} 
+0

아마도'for '루프 내부에'c! ='\ n "가 있기 때문이다. 그렇지 않으면'for 루프 '가'c! ='\ n''가 내부적으로 실행을 계속할 것이기 때문이다. 그 시점에서 프로그램은 다음 라인으로 이동하겠습니까? – dud3

+0

커스텀'getline'은'max'에 도달 한 후에 왜 문자를 계속 읽습니까? –

+1

파일 수준에서 밑줄로 시작하는 이름은 구현을 위해 예약되어 있습니다. 응용 프로그램 코드에서 사용해서는 안됩니다. – Olaf

답변

1

어떻게 그것을 (다양한 재료가 발생하지 않습니다)하지만 키를 누르면 입력 할 때까지 결과를 인쇄하지? stdin에서

전형적인 입력 라인를 버퍼링된다. 다음은 첫 번째로 반환 - 또는 '\n'를 누르면 입력하거나 버퍼 채우기 (어쩌면 4K 문자) 또는 EOF가 발생할 때까지 @John Coleman

아무것도getchar()에가 대기하고을 기다립니다 사용할 수 없습니다 캐릭터. 이후에 getchar()을 호출하면 버퍼링 된 회선 입력을 사용하여 신속하게 반환 될 수 있습니다.

버퍼링 동작은 구현에 따라 다릅니다. C로 지정되어 있지 않다.

+0

또 하나 바보 같은 질문, 우리가 입력하는 동안'_getline()'에'for() loop'가 내부적으로 반복 되는가, 아니면 단순히 기다리는가? 한 번'getchar()'에 우리가 모든 것을 입력하고 반복 할 때까지. 'for 루프'는 입력이 끝날 때까지 getchar()를 기다리는 것일까 요? – dud3

+0

@ dud3'for' 루프는 I/O와 관련이 없습니다. 'getchar()'는'stdin'으로부터 입력이있을 때까지 기다렸다가 리턴합니다. 'stdin'은 일반적으로 _line buffed_이기 때문에 사용자가''12 \ n "'을 입력 한 다음''1 ''을 반환 할 때까지 첫 번째'getchar()'이 _waits_를 호출하는 것을 의미합니다. 'getchar()'은 즉시''2 '를 반환하고, 다음 호출은''\ n''을 즉시 반환하고, 다음 호출은 사용자가''34를 입력 할 때까지 기다린다. "그리고''3 ''을 반환합니다 ... – chux