我試圖創造一些代碼,將只接受用戶輸入,沒有像整數詢問姓名等時有效...... 到目前爲止我試過,接受有效輸入領域
if(!gets(newCust.name))
{
printf("invalid data\n");
menu();
}
但是,由於名稱是字符串類型,所以當用戶輸入整數時,它似乎是有效的。有沒有其他簡單的選擇我可以使用?
我試圖創造一些代碼,將只接受用戶輸入,沒有像整數詢問姓名等時有效...... 到目前爲止我試過,接受有效輸入領域
if(!gets(newCust.name))
{
printf("invalid data\n");
menu();
}
但是,由於名稱是字符串類型,所以當用戶輸入整數時,它似乎是有效的。有沒有其他簡單的選擇我可以使用?
驗證輸入(特別是來自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);
}
我會建議,而不是排除了無限的無效選項,您可以定義有效值應該是什麼,然後檢查了點。通常的做法是使用regular expression。可能需要檢查與\w[\w\s]*
類似的正則表達式,意思是「至少包含一個單詞字符,後跟任意數量的單詞字符和空格」。