2017-03-04 147 views
0

scanf成功轉換請求格式的輸入字符(本例中爲十進制整數"%d")時,返回1表示「轉換成功」。掃描功能測試

嗯,我恐怕我不明白。

我想使用此功能來立即過濾輸入:如果輸入不是整數(正數或負數),則會請求另一個輸入。

#include<stdio.h> 
#include<stdlib.h> 

int main(){ 
     int x; 
     printf("\nThis function reads an integer\n"); 
     while(scanf("%d", &x) != 1){ 
       printf("Please type an integer:\n"); 
       scanf("%d", &x); 
     } 
     printf("\n%d is really an integer!\n", x); 
     return 0; 
} 

但在這種情況下,將2.15輸入,scanf只讀取數2,然後成功地關閉循環。

+1

也許你想使用浮點格式和類型?或者您可以閱讀整行(例如['fgets'](http://en.cppreference.com/w/c/io/fgets)),然後使用['strtol'](http:// en。 cppreference.com/w/c/string/byte/strtol)轉換爲整數?使用['strtol'](http://en.cppreference.com/w/c/string/byte/strtol),您可以檢查轉換結束的位置,以及是否轉換了整個字符串。 –

+1

爲什麼你使用2次scanf? – tilz0R

+0

@ tilz0R不是第一個(scanf(「%d」,x)== 1)邏輯條件? – Worice

回答

2

%d基本上與strtol的作用相同:它丟棄空格,然後讀取數字,直到遇到第一個非數字字符並將讀取的數字轉換爲整數值。如果至少讀取了一位數字,則認爲轉換成功,無論「停止閱讀」的字符是什麼。

因此,在您的情況下,.是非數字字符,但2已被讀取,因此轉換僅使用字符串"2"併成功。

爲了解決這個問題,你需要首先考慮你想允許哪些字符結束整數(顯然,.不在其中)。然後閱讀字符,直到遇到其中一個字符,然後將其轉換爲strtol

+1

然後,我的方法來過濾輸入是不可行的。謝謝你的建議! – Worice

1

Scanf做了你所要求的:它從輸入流中讀取一個整數並忽略其餘的不能解釋爲int

如果要進行輸入過濾,最好是將整行讀取爲字符串(例如使用fgets),解析輸入並相應地執行操作。

+0

謝謝您的建議! – Worice

+1

這是不正確的。對'scanf()'的調用不會丟棄以下字符。那些後面的字符仍然在輸入流中,正在等待處理。 – user3629249

+0

這就是我所說的「丟棄」的意思。 @ user3629249 – lukeg