我想寫一個代碼以確保用戶只輸入1位數。如果用戶輸入類似「0 1 3」的內容,我希望我的程序讀取一條我不知道該如何操作的錯誤消息。任何人都有一個想法如何解決這個問題?我現在的代碼只需要第一個數字,如果一個用戶輸入一串數字,其間有一個空格。C中的數據驗證 - 確保輸入的格式正確
請參閱下面的代碼。謝謝:d
//Prompt the user to enter the low radius with data validation
printf("Enter the low radius [0.0..40.0]: ");
do
{
ret = scanf("%lf", &lowRadius);
//type validation
if (ret != 1)
{
int ch = 0;
while (((ch = getchar()) != EOF) && (ch != '\n'));
printf("Wrong input. Please enter one numerical value: ");
}
//range validation
else if((lowRadius < 0 || lowRadius > 40))
{
printf("Incorrect value. Please enter in range 0-40: ");
}
else break;
} while ((ret != 1) || (lowRadius < 0 || lowRadius > 40));//end while lowRadius
你們已經有了代碼。使用'getchar'從輸入中讀取,直到找到換行符。如果任何非空白字符位於換行符之前,則輸入無效。另外,你不需要'do {} while'循環,因爲你反正使用'break'。一個簡單的'while(1){}'或'for(;;){}'循環可以工作。輸入有效時只需「斷開」循環。 – user3386109
這是因爲scanf在很多層次上都是不安全的。看看[這篇文章](http://stackoverflow.com/questions/30577519/error-c4996-scanf-this-function-or-variable-may-be-unsafe-in-c-programming)關於爲什麼不建議使用它,再加上一個替代品。你也應該考慮使用外部或第三部分庫來安全地解析你的輸入。 – Joel
用戶如何使用一位數字輸入像'39'這樣的值?你的意思是'單一號碼'?分數怎麼樣(39.23423)?正如你已經被告知的那樣,'scanf()'可能不是工具;使用'fgets()'來讀取一行,然後使用'sscanf()'或者'strtod()'來轉換值,仔細處理錯誤條件並檢查數字之後和換行符之前是否有碎片。 –