2014-02-07 2 views
1

이 코드 블록에 문자 또는 그 이상의 문자가 입력 된 경우 어떻게 버퍼를 지울 수 있습니까?입력 확인 및 키보드 버퍼 지우기

int x = 1; 
float grade = 0.0; 

do 
{ 
    printf ("Enter a grade for quiz %d: ", x); 
    scanf ("%f", grade); 

    if (grade >= 1 && grade <= 10) break; 

    printf ("Entry not valid. Please try again\n"); 

} while (1); 

강사는 fflush (stdin)을 사용한다고 주장합니다. 내가 알기로는 일하지 않을 것이고, 나는 그를 그에게 불렀다. 숫자를 입력했는지 확인하는 다른 방법은 무엇입니까?

+0

당신은 단순히 문자열을의 getline 접근 방식을 사용하고 구문 분석에 읽을 수 자신은 단지 하나의 소수점으로 숫자 확인하기 위해. 확인 후에 실제 숫자 유형으로 변환 한 다음 원하는대로 처리합니다. – trumpetlicks

+1

왜 작동하지 않습니까? 나는 그것을 사용하고 멋지다! 나는 당신이 그것을 틀린 방법으로 사용하고 있다고 생각한다. –

+0

user689 어떻게 fflush를 올바르게 사용할 수 있습니까? fflush (stdout)을 여러 장소에 넣었지만 코드는 계속 무한 루프에 들어갑니다. – user3284399

답변

1
void flush_stdin() 
{ 
    char c; 
    do 
    { 
     c = get(stdin); 
    }while(c != EOF && c != '\n'); 
} 

난 당신이 지금 비어 있다는 신호가 발생할 때까지 기본적으로 표준 입력의 모든 문자를 읽어 내 자신의 코드에서 이것을 사용합니다.

또한 scanf를 피하기를 권합니다. 그러나 freadsscanf으로 사용하는 것이 더 좋으므로 버퍼 오버플로 및 기타 불쾌한 일이 발생하지 않도록 입력 문자 수를 제한 할 수 있습니다.

+1

초기 getchar 호출을 수행하지 않아도되도록 대신 do-while을 선택할 수 있습니다. – trumpetlicks

+0

고마워, 나는 매번 프로젝트에서 프로젝트에 이르는 코드 조각을 기억하려고 노력하고있다. 적어도 처음 시도 할 때는 functionnal을했다. – DrakaSAN

+0

완전히 들었다. 나는 항상 내 코드를 되돌아 볼 필요가 있으며, 처음에는 거의 제대로 읽을 수 없다 :-) – trumpetlicks

0

잘못된 읽기로 입력 버퍼를 플러시하지 말고 항상 fgets()/sscanf()을 사용하여 전체 라인을 읽으십시오.

Read_long

do 
{ 
    char buf[50]; 
    printf ("Enter a grade for quiz %d: ", x); 
    if (fgets(buf, sizeof buf, stdin) == NULL) 
     Handle_EOForIOError(); 
    if (sscanf(buf, "%f", grade) == 1 && grade >= 1 && grade <= 10) 
     break; 
    printf ("Entry not valid. Please try again\n"); 
} while (1);