2013-04-02 20 views
0

我是一名初學者程序員。我有一個不允許輸入浮點數或字符的函數。它使用gcc 3.4.2正常工作,但現在我更新到4.7.1,它不能正常工作。它只適用於第一個輸入a [0]。如果我輸入「x」,它會顯示「錯誤的輸入」,但是如果我輸入例如'1'爲[0],然後'x'爲[1],它仍然會說輸入OK並且爲[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

你嘗試過調試運行你的代碼?或者至少是某種記錄? –

+6

_如果給定的流是輸入類型,那麼函數的行爲是undefined._:來自http://en.cppreference.com/w/c/io/fflush – hmjd

+0

你的數組是unsigned int,你是從整體上讀取雙倍的wgy?!。爲什麼不直接從標準輸入中讀取unsigned int「%u」 – MOHAMED

回答

3

您應該檢查返回值scanf。它返回它成功地「掃描」項目的數量,這將是零,如果它沒有掃描任何東西,例如,當你輸入'x'

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'在緩衝區中。 – 2013-04-02 12:23:14

+0

@Armin它會在scanf(「%lf」,&q)的下一次掃描中被捕獲,這就是爲什麼我在這個scanf的字符串格式的開頭添加了一個空格。所以你的downvote是錯的 – MOHAMED

+0

不,你退出stdin時,退出循環。去調試你自己的代碼。 – 2013-04-02 13:35:28