2013-09-22 32 views
0

我正在處理程序,其中向用戶顯示選項列表,然後他將輸入一個整數來指定他想要選擇的選項。現在,消除了用戶可能輸入除有效值之外的整數值的情況。但是如果他輸入任何其他值,比如說一個字符或一個字符串,程序就會進入無限循環,無限期地打印選項列表。我該如何糾正這一點?我的意思是,當我輸入一個不是整數的值時,我應該能夠給我的用戶一個錯誤。C++用戶輸入整數變量的非整數值

任何幫助表示讚賞。這是一個示例代碼。

do{ 
    printf("Select appropriate option.\n"); 
    printf("Press 1 to do this"); 
    printf("Press 2 to do that.\n"); 
    printf("Press 3 to exit the program.\n"); 
    scanf("%d",&choice); 
    if(choice!=1 && choice!=2 && choice!=3) 
     printf("You entered an invalid choice. Please enter again.\n"); 
    switch(choice){ 
     case 1: 
      //do this 
      break 
     case 2: 
      //do that 
      break; 
     case 3: 
      exit(1); 
      }} 


while(choice!=3); 

當用戶對choice進入非整數值,所以基本上我想要的程序來通知用戶,並要求他再輸入。

+0

這沒有真正的理由被標記爲[C++]而不是[C]。 – AnT

回答

1

它不能直接scanf進行到一個整數變量。這樣的scanf不僅會接受1.23,還會接受1abcde等輸入。 scanf(和其他轉換函數)儘可能按照所要求的格式進行讀取。當它發現某些不符合格式要求的內容時,它會停下來,並將其保持原樣。

如果要執行此類分析,則必須將輸入讀取爲字符串,然後手動解析並分析該字符串。

C風格的代碼草圖(因爲你堅持C風格的代碼,儘管有標記它作爲[C++])可能如下

char buffer[100]; /* 100 should be enough for everyone :) */ 
int n = scanf("%s", buffer); 
if (n < 1) 
    /* ERROR, can't read */; 

char *end; 
long choice = strtol(buffer, &end, 10); 
if (end == buffer || *end != '\0' || errno == ERANGE) 
    /* ERROR, bad format */; 

/* ... */ 
+0

你在代碼的第二部分究竟做了什麼,從'char * end'開始 – fts

+0

'strtol'是一個將字符串轉換爲整數(long類型)的函數。看到這個問題http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-atoi-failed-or-if-it-was-a-string-of-zeros和我的答案在那裏。 'end'是一個指針,它會告訴你轉換過程停止的地方。通過分析該指針的值,您可以確定輸入字符串是「純」整數還是整數後跟其他內容,即捕獲和拒絕輸入如「1.23」和「1abcd」。 – AnT

+0

謝謝。這工作。 – fts

0

scanf在轉換%d時不會消耗任何非數字。它將返回0,因爲它沒有轉換任何內容,並且「壞的輸入」仍將在那裏等待消耗。您必須以某種方式使用它才能爲有效輸入做好準備。

(也注意到你在你的if排除3在switch測試它之前)

0

isdigit會檢查任何輸入這是一個數字(數字)類型。 爲此包括頭文件ctype.h。

如果輸入不正確,也終止您的程序使用exit(0)。 對於這包括標頭stdlib.h。

#include<ctype.h> 
#include<stdlib.h> 

char c; 
scanf("%c", &c); 
if (isdigit(c)) 
{ 

case statement... 
... 
... 
} 
else 
{ 
printf("Wrong input"); 
exit(0); 
}