2013-04-02 2 views
0

저는 초급 프로그래머입니다. 나는 플로트 숫자 나 문자를 입력하지 못하게하는 기능을 가지고있다. 그것은 gcc가 3.4.2와 잘 작동했지만 지금은 4.7.1로 업데이 트하고 제대로 작동하지 않습니다. 이제 첫 번째 입력 a [0]에서만 작동합니다. 입력 한 내용이 'x'라고하면 '잘못된 입력'이 표시되지만 [1]에 대해 '1'을 입력 한 다음 [1]에 'x'를 입력해도 입력 확인 및 a [1]에 '1'을 할당; 이 문제를 어떻게 해결할 수 있습니까? 고맙습니다!C, 다른 GCC, fflush()가 작동하지 않습니까?

void initArray(unsigned int a[]) { 

double q; 
int x, c; 

for (x = 0; x < SIZE; x++){ 
    printf("a[%d] ", x); 
    printf("Enter number: "); 

    scanf("%lf", &q); 

    if (q == (unsigned int) q) { 
     printf("Input OK.\n"); 
     a[x] = q; 
     fflush(stdin); 
    } 
    else { 
     printf("Wrong Input\n"); 
     fflush(stdin); 
     x--; 
    } 
} 
printf("\n"); 
} 
+0

당신은 당신의 코드를 debuging 시도? 또는 적어도 어떤 종류의 벌채? –

+6

_ 주어진 스트림이 입력 유형 인 경우 함수의 동작은 undefined입니다. _ : http://en.cppreference.com/w/c/io/fflush – hmjd

+0

배열의 부호없는 정수는 사용자가 int wgy에서 더블 읽기?! "% u"표준에서 부호없는 int를 직접 읽지 않는 이유 – MOHAMED

답변

3

scanf의 반환 값을 확인해야합니다. 당신이 입력 'x' 때 예를 들어, 아무것도 검사에 실패 할 경우 0이됩니다은 "스캔"관리 항목 수를 반환 : 나는 당신에게 제안

if (scanf("%lf", &q) == 1) 
{ 
    printf("Input OK.\n"); 
    a[x] = q; 
} 
else 
{ 
    printf("Wrong Input\n"); 
    x--; 
} 
0

교체

scanf("%lf", &q); 

while ((c=(scanf(" %lf%c", &q, &tmp) !=2 || !isspace(tmp))) 
     || (q != (unsigned int) q)) { 
    printf("Your input is invalid please enter again: "); 
    if(c) scanf("%*[^\n]"); 
} 

scanf("%*[^\n]"); 코드에서 fflush(stdin)에 대해 더 이상 당신의 표준 입력 그렇게 필요를 청소하지

그래서 당신의 코드가 될 수있다 :

void initArray(unsigned int a[]) { 

double q; 
int x, c=0; 
char tmp; 


for (x = 0; x < SIZE; x++){ 
    printf("a[%d] ", x); 
    printf("Enter number: "); 

    while ((c=(scanf(" %lf%c", &q, &tmp) !=2 || !isspace(tmp))) 
       || (q != (unsigned int) q)) { 
     printf("Your input is invalid please enter again: "); 
     if(c) scanf("%*[^\n]"); 
    } 

    a[x] = q; 
} 
printf("\n"); 
} 
+0

-1,'scanf ("% * [^ \ n]");는'\ n'을 버퍼에 둡니다. –

+0

@Armin'scanf ("% lf", & q)'의 다음 스캔으로 막혀서 왜이 scanf의 문자열 형식의 시작 부분에 공백을 추가 했는가? 그래서 downvote가 잘못되었습니다 – MOHAMED

+0

루프를 종료 할 때 stdin에 그대로 두지 마십시오. 자신의 코드를 디버그하십시오. –