2012-12-21 2 views
19

기본적으로 stdin은 버퍼링 된 입력입니다. 10어쨌든 stdin 버퍼를 들여다 볼 수 있습니까?

입니다

int main() 
{ 
    char c[10] = {'\0'}; 
    scanf("%9s", c); 
    printf("%s, and left is: %d\n", c, getchar()); 
    return 0; 
} 

안녕하세요
안녕하세요
./a.out, 왼쪽 : 같은 scanf()로 그 증거는 stdin의 "데이터를두고"메커니즘의의 사용에 물론

10되는 줄 바꿈 ...

난 항상에서 "슬쩍"어쨌든이, 호기심 봤는데 stdin 버퍼가 없어도 버퍼가 있습니까?

편집
더 좋은 예는 다음과 같을 수 있습니다 "at.ct"의 입력으로

scanf("%9[^.]", c); 

, 지금은 stdin에 남아있는 "데이터"(ct\n), 그냥 줄 바꿈이있다.

+1

엿보기 후에'ungetc()'할 수 있습니다. 충분하다? –

+0

@DanielFischer - 나쁘지 않은가 보군 ... 전체 인물이 남아 있다면 어떻게 될까? stdin에 남아있는 데이터의 길이를 알 수 있습니까? 아니면 하나 이상의 문자를'ungetc() '할 수 있습니까? – Mike

+0

"푸시 백의 한 문자가 보장됩니다. 'ungetc' 함수가 동일한 스트림에서 너무 자주 호출되어 해당 스트림에서 읽기 또는 파일 위치 지정 작업을 수행하지 않으면 작업이 실패 할 수 있습니다." 일반적으로 둘 이상을 ungetc 할 수 있지만 단 하나만 보장됩니다. –

답변

11

이식 가능하게 입력 스트림의 다음 문자를 getchar()으로 가져온 다음 ungetc()으로 다시 밀어 넣으면 문자가 스트림에서 제거되지 않은 것과 같은 상태가됩니다.

ungetc 함수는 입력 스트림을 가리키는 스트림에 다시 (AN unsigned char 변환) c 의해 지정된 문자를 민다. 푸쉬 백 문자는 푸시의 역순으로 그 스트림에 대한 후속 읽기에 의해 리턴됩니다.

표준에서 푸시 백이 한 문자 만 보장되지만 일반적으로 더 많이 뒤로 밀 수 있습니다.

다른 답변에서 언급 한 바와 같이 널 포인터가 아닌

buf 경우가 가리키는 배열을 : 그 문제없이 아니지만 당신이 setvbuf과 자신의 버퍼를 제공하는 경우가 코멘트, 실제로, 당신은 거의 확실 버퍼에서 엿볼 수 있습니다 setvbuf 함수에 의해 할당 된 버퍼 대신에 사용할 수 있습니다.

제공된 버퍼가 전혀 사용되지 않을 가능성이 있습니다.

언제든지 배열의 내용은 불확정합니다.

즉, 버퍼의 내용이 실제 입력을 반영한다는 보장이 없다는 것을 의미합니다. 즉, 자동 저장 기간이있는 경우 버퍼가 정의되지 않은 동작을한다는 보장이 없음을 의미합니다.

그러나 실제적으로 주요 문제는 버퍼링 된 입력의 아직 소비되지 않은 부분이 어디에서 시작되고 끝나는지를 찾는 것입니다.

+1

입력 버퍼가 비어있을 때까지 'getchar'을 읽지 않을 것입니까? –

+0

사실, 그렇습니다. 그러나 버퍼가 비어 있는지 확인하는 이식성있는 방법을 알지 못합니다. –

5

stdin에 setvbuf으로 자신의 버퍼를 설정하고 필요할 때마다 그곳을 들여다 볼 수 있습니다.

+0

어떻게'ungetc'와 상호 작용합니까? 나는'ungetc' 문자가 다른 변수에 저장되어 있다고 생각한다. 또한 버퍼의 어떤 부분을 읽고 어떤 부분을 남겨 두 었는지 어떻게 알 수 있습니까? – Shahbaz

+0

'setvbuf() 함수는 stdout, stdin, stderr.에 영향을주지 않습니다.'내가 읽은 것입니다. 작동하는 예제가 있습니까? – Mike

+0

@Mike 창문에서 작동하는 것 같습니다. 'ungetc'은 예상대로 작동합니다. 읽기/왼쪽 위치를 추적하는 방법에 대해서는 완전히 확신 할 수 없습니다. 그러나 담황색의 담황색이 새겨 져 있으면 쉽게 될 것입니다. – nullpotent

3

당신이 그것을 변경하지 않고 stdin 버퍼를보고 싶은 경우에, 당신은 당신이 액세스 할 수있는 배열을 사용하여, setbuf와 다른 버퍼를 사용하도록 말할 수 :

char buffer[BUFSIZ]; 

if (setbuf(stdin, buffer) != 0) 
    // error 

getchar(); 

printf("%15s\n", buffer); 

을이하자 당신보다 뭔가 더보기 ungetc,하지만 저는 휴대용 방식으로 더 나아갈 수 있다고 생각하지 않습니다.

사실이 법적하지만 setvbuf에 대해 그것에서 인용 표준에 대한 올바르지 않은 (setbuf 같은 동작을 가지고) :

언제든지 배열의 내용이 확정됩니다.

완벽한 이식성 및 표준 준수를 원할 경우 필요한 것은 아니지만 예상되는 내용이 버퍼에 포함되어서는 안되는 이유가 무엇인지 상상할 수 없습니다. 그러나 그것은 내 컴퓨터에서 작동하는 것 같습니다.

적어도 BUFSIZ 문자의 배열을 setbuf에 제공해야하며 그 전에 스트림에서 I/O 연산을 수행하지 않아야합니다. 유연성이 더 필요하면 setvbuf을 살펴보십시오.

관련 문제