2014-04-07 1 views
2

사용자로부터 입력을 받고 함수가 정수이고 문자가 포함되어 있지 않은지 확인해야합니다.입력이 정수인지 확인

정수 및 단일 문자에 완벽하게 작동하는이 코드를 작성했습니다. 그러나 dfd 즉 여러 문자 입력을 입력하면 종료됩니다.

#include <ctype.h> 

int getint() 
{ 
    int input = 0; 
    int a; 
    int b, i = 0; 
    while((a = getchar()) != '\n') 
    { 
     if (a<'0'||a>'9') 
     { 
      printf("\nError in input!Please try entering a whole number again:"); 
      input=0; 
      fflush(stdin); 
      return getint(); 
     } 
     b = a - '0'; 
     input = ((input*10) + b); 
     i++; 
    } 
    return input; 
} 
+0

친구는 배우 [들여 쓰기] (http://www.cs.arizona.edu/~mccann/indent_c.html). –

+0

왜 stdin에서 fflush을하고 있습니까? 출력 함수입니다 (내가 정말로 모호한 것을 배울 것이 아니라면). fpurge를 의미 했습니까? – DrC

+2

'fflush (stdin)'의 동작은 C 표준에 의해 정의되어 있지 않습니다. 이것은 몇몇 구현체와 POSIX에 의해 정의되지만 여기서는 유용하지 않습니다. 당신이하고 싶은 것은''\ n ''또는'EOF'가 나타날 때까지 입력 문자를 읽고 버리는 것입니다. –

답변

1

문제는 fflush (stdin) 호출이 정의되지 않았을 수 있습니다. fflush는 입력 스트림이 아닌 출력 스트림을 플러시하는 데 사용됩니다. 다른 방법으로 대체하여 while (getchar() != '\n');과 같은 나머지 입력 버퍼를 지우고 문제가 해결되는지 확인하십시오. (무한 루프가 아니기 때문에 EOF 잡기와 같은 더 강력한 작업을 수행해야합니다.)

+0

감사합니다. 매력처럼 작동했습니다! 이것이 입력 버퍼를 지우는 가장 쉬운 방법이었습니다. 다른 대안이 있습니까? –

+0

질문을 upvote –

1

fflushfpurge에이 프로그램이 나를 위해 작업을 시작 인한 변경 : 다음은 리눅스의 gcc로 컴파일 내 코드입니다.

+0

fpurge는 비표준이며 이식성이 없습니다. 그리고 그 man 페이지를 인용하면 : "보통 입력 버퍼를 버리고 싶어하는 실수입니다." –

+0

stdio.h에 fpurge가 포함되어 있지 않습니다. 어디에서 찾을 수 있습니까? –

2

입력 스트림에서 fflush을 호출하면 정의되지 않은 동작이 호출됩니다. 구현시 입력 스트림에 대해 정의하더라도 구현할 수 없습니다. 입력 스트림을 플러시하는 표준 방법은 없습니다. 따라서 fflush(stdin);이 올바르지 않습니다. 문자를 읽고, stdin 버퍼에 줄 바꿈까지 포함하여 버려야합니다. 나는 당신의 기능에 다음과 같은 변화를 제안한다.

int getint(void) { 
    int input = 0; 
    int a; 

    while((a = getchar()) != '\n') { 
     if (a < '0' || a > '9') { 
      printf("Error in input!Please try entering a whole number again:\n"); 
      input = 0; 

      // read and discard characters in the stdin buffer up till 
      // and including the newline 
      while((a = getchar()) != '\n'); // the null statement 
      return getint(); // recursive call 
     } 
     input = (input * 10) + (a - '0'); 
    } 
    return input; 
} 

또한,이 C FAQ를 읽어 보시기 바랍니다 - If fflush won't work, what can I use to flush input?

+0

의미가 있습니다, upvote 질문! –