2013-01-08 78 views
1

我試圖創造一些代碼,將只接受用戶輸入,沒有像整數詢問姓名等時有效...... 到目前爲止我試過,接受有效輸入領域

if(!gets(newCust.name)) 
    { 
     printf("invalid data\n"); 
     menu(); 
    } 

但是,由於名稱是字符串類型,所以當用戶輸入整數時,它似乎是有效的。有沒有其他簡單的選擇我可以使用?

回答

3

驗證輸入(特別是來自C)可能是相當多的工作。一般來說,我會這樣做的方式是讀取緩衝區(您應該使用fgets(..., stdin)而不是gets來避免緩衝區溢出)。讀完緩衝區後(不管輸入是什麼),然後編寫代碼來驗證緩衝區中的數據。

例如,您可以使用strtol從緩衝區讀取整數值。這將允許您確定緩衝區是否有一個整數(並且只有一個整數)。

下的總體思路是:

char buf[1024]; 
int val; 
char *endptr; 

printf("Enter something..."); 
if (fgets(buf, sizeof buf, stdin)) { 
    val = strtol(buf, &endptr, 10); 

    // check for some of the possible errors 
    if (val == LONG_MIN) 
     printf("Underflow error (%d)\n", errno); 
    else if (val == LONG_MAX) 
     printf("Overflow error (%d)\n", errno); 
    else if (endptr == buf) 
     printf("No digits provided\n"); 
    else if (*endptr != '\0' && *endptr != '\n') 
     printf("Something besides an integer was given (%u)\n", *endptr); 
    else 
     printf("The value is apparently valid\n"); 
    printf("val = %d\n", val); 
    } 
0

我會建議,而不是排除了無限的無效選項,您可以定義有效值應該是什麼,然後檢查了點。通常的做法是使用regular expression。可能需要檢查與\w[\w\s]*類似的正則表達式,意思是「至少包含一個單詞字符,後跟任意數量的單詞字符和空格」。

另請參閱:Regular expressions in C: examples?