我遇到了一個令人討厭的問題,我寫了一個C++函數,其目的是驗證用戶輸入。該函數讀取用戶輸入,驗證它是否是數字,如果是,它是否在範圍[min,max]中。將字符串錯誤的類型轉換爲unsigned int
當我使用無符號類型調用模板函數(如size_t
),並且輸入是負數時,會發生此問題。字符串流將字符串轉換爲類似於4294967291的字符串。我可以看到程序正在將數據轉換爲接近無符號數據類型的最大值(在numeric_limits標頭中定義)的值,但我的問題是爲什麼,因爲if
語句應該停在sstream >> value
?
我的代碼:
template <class T>
T getNumberInput(std::string prompt, T min, T max) {
std::string input;
T value;
while (true) {
try {
std::cout << prompt;
std::cin.clear();
std::getline(std::cin, input);
std::stringstream sstream(input);
if (input.empty()) {
throw EmptyInput<std::string>(input);
} else if (sstream >> value && value >= min && value <= max) {
std::cout << std::endl;
return value;
} else {
throw InvalidInput<std::string>(input);
}
} catch (EmptyInput<std::string> & emptyInput) {
std::cout << "O campo não pode ser vazio!\n" << std::endl;
} catch (InvalidInput<std::string> & invalidInput){
std::cout << "Tipo de dados inválido!\n" << std::endl;
}
}
}
謝謝您的時間!
不要傳遞它一個無符號類型? – Mud 2010-11-11 04:38:38