2013-05-26 1 views
3
scanf("%9s", line); 

stdin (최대 9 개 기호)에서 한 줄을 읽은 후 사용자 입력에서 모든 문자를 읽었는지 확인하고 싶습니다. 그것을 할 우아한 방법이 있습니까?scanf 이후 몇 개의 문자가 stdin에 남아 있는지 확인하는 방법은 무엇입니까?

+2

'feof()'를 시도 했습니까? –

+0

feof (stdin)를 의미합니까? 방금 시도했는데 어떤 길이의 문자열을 입력했는지 상관없이 0을 반환합니다. – user1242967

+1

'feof (stdin)'은 내가 입력 한 길이에 관계없이 0을 반환합니다. - 다음 I에서 읽을 수있는 개행 문자가 있음을 알려줍니다./O operation ... 최종 줄 바꿈없이 EOF를 만나면 아무런 데이터도 남지 않을 것입니다. –

답변

2

feof() 표준 버퍼가 비어 있는지 확인할 수 있습니다. BUF의 데이터 BUFSIZ 바이트를 저장할 배열/문자열이 될 것입니다 다른 사람은 더 나아가 내용을 확인 ... 이런 식으로 뭔가를 사용하려면 .. 여기

while (fgets(buf,BUFSIZ,stdin) != NULL) 
    {  printf("%s",buf); } 

+0

feof()는 0을 계속 반환합니다. 아마도 나쁜 방법으로 문자열을 읽는 중입니까? feof()가 모든 것을 읽은 후 하나와 같지 않게하는 방법의 예가 될 수 있습니까? – user1242967

+0

콘솔에서 (Linux)을 눌러 feof()가 1을 반환하도록해야합니다. sth. select(), poll(), ... 같이 문제를 해결할 수 있습니다. –

1

것은에서 인간의 입력을 분리 추천 파싱. 사람들은 예기치 않은 문자를 입력합니다. 그리고 변하지 않는이 문제를 올바르게 처리하는 것이 더 쉽다는 것을 알았습니다. 라인에

읽기

char buf[1024]; 
char *retval; 
retval = fgets(buf, sizeof(buf), stdin); 
// if I/O trouble reading ... 
if (!retval) { 
    handle error 
} 
// if End-of-line missing (as buffer was filled) ... 
if (!strchr(buf, '\n')) { 
    handle error 
} 
// Toss '\n' 
buf[strlen(buf) - 1] = '\0'; 

그런 다음

sscanf(buf, "%9s", line); 
if (strlen(buf) > 9) { 
    // You have extra data 
    } 
+1

'retval = strchr (buf, '\ n')) == 0) {... handle error ...} * retval = '\ 0';'입력의 두 번째 스캔을 피한다. newline이 어디에 있는지 이미 알고있을 때 문자열. –

+0

@Jonathan Leffler는 정확합니다. 보통 나는 이것을 반대로하고 문자열 길이를 찾고,> 0인지 확인한 다음 마지막 문자가 \ n이면 삭제합니다. 그러나 그 접근법은 덜 명확 해 보입니다. – chux

+0

Yup :'strlen()'또는'strchr()'을 사용할 수 있지만,이 문맥에서 둘 다 사용할 필요는 없습니다. 그러나 일반적인 접근법은 정확합니다. 'fgets()'와 일반적으로 더 나은 분석이 있습니다. 그럼에도 불구하고'feof()'는'fgets()'가 0을 리턴 할 때까지는 true를 리턴하지 않을 것입니다. 다음 읽기가 아무것도 리턴하지 않을 때를 알지 못합니다. 마지막 읽기가 아무것도 반환하지 않았을 때를 알 수 있습니다. –

0

먼저 더 큰 문자열로 데이터를 읽고 나중에 길이를 얻을 수있는 데이터를 구문 분석 (I가 자신의 기능을 넣어이) . 어떤 시점에서 입력 버퍼에 남겨진 것이 무엇이든 없애고 싶습니다. 일부 시스템에서는 fflush를 사용하고 다른 모든 시스템에서는 fpurge를 사용할 수 있습니다.

다음은 큰 버퍼를 채우고 나머지 버퍼를 제거하는 데 사용할 수있는 몇 가지 샘플 코드입니다. 청소 기능은 특수 문자가있는 경우 마지막 줄 바꿈을 제거하거나 문자열을 일찍 종료합니다.

void userInput(char * str, int size); 
void get(char * str, int size); 
void clean(char * str, int size); 
void flush(void); 

void userInput(char * str, int size) 
{ 
    get(str, size); 
    clean(str, size); 
    flush(); 
} 

void get(char * str, int size) 
{ 
    memset(str, 0, size); 
    fgets (str, size, stdin); 
} 

void clean(char * str, int size) 
{ 
    char * c; 
    str [size -1] = 0; 
    c = str; 
    while(*c >= ' ' || *c < 0) ++c; 
    *c = 0; 
} 

void flush(void) 
{ 
    //the ifdef approach does not work in reality. 
    //this is a pseudo case for your benefit. 
    #ifdef fpurge 
     fpurge(stdin); 
    #else 
     fflush(stdin); 
    #endif 
} 
+1

fflush가 stdin에서 올바르지 않습니다. – rationalcoder

관련 문제