[英]C++ test if input is an double/char
我正在嘗試從用戶那里獲取輸入,並且需要知道一種讓程序識別輸入是或不是雙精度/字符的方法,這就是我現在所擁有的……但是當您輸入的輸入類型不正確時
1)雙重測試只是無限循環
2)即使輸入正確,字符也不會停止循環
int main () {
double _double = 0;
bool done = true;
while ( done ) {
cout << "Please enter a DOUBLE:\n" << endl;
cin >> _double;
if ( _double > 0 ) { done = false; }
if ( _double < 0 ) { cout << "\nthe number you entered was less than zero\nplease enter a valad number..." << endl; }
if(cin.fail()) { cin.clear(); }
}
done = false;
char _char = ' ';
while ( !done ) {
cout << "Please enter a CHAR" << "\n";
cout << "\t'y' = yes\n\t'n' = no" << endl;
cin >> _char;
if ( _char == 'y' || _char == 'n' ) { done = true; }
if ( ! (_char == 'y' || _char == 'n') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
if(cin.fail()) { cin.clear(); }
}
最好的辦法是始終將您的輸入讀取為字符串。 然后,您可以使用std::strtod()
類的函數來測試並轉換為雙精度數。 檢查流是否失敗然后重置它們充其量是容易出錯的,並且不會給您產生好的錯誤消息的可能性。
例如:
string s;
cin >> s;
char * p;
double d = strtod( s.c_str(), & p );
if ( * p == 0 ) {
cout << "Read double: " << d << endl;
}
else {
cout << "Read string: " << s << endl;
}
指針“p”將指向第一個不能轉換為雙精度的字符。 您如何處理這實際上取決於您的應用程序的邏輯。
問題在於,當您讀取某些內容並且cin
看到輸入永遠不會是雙精度值時,它會停止讀取,將未消耗的內容留在緩沖區中。 它會發出失敗的信號,你清除了它,但你不會吃掉cin
沒有吃掉的剩余輸入。 因此,下次嘗試再次讀取相同的錯誤輸入時,再次......
char
one 的問題是您必須按返回鍵才能使其處理大多數終端上的任何字符(例如,如果您讓程序從文件中讀取,則不會發生這種情況)。 因此,如果您按y
則它不會退出 read 調用,直到您按下返回鍵。 但是,它通常會繼續並退出循環。
正如其他人所說,您最好閱讀整行,然后再決定要做什么。 您還可以使用 C++ 流而不是 C 函數檢查數字:
bool checkForDouble(std::string const& s) {
std::istringstream ss(s);
double d;
return (ss >> d) && (ss >> std::ws).eof();
}
這將讀取任何初始雙數,然后讀取任何剩余的空格。 如果它隨后命中eof
(文件/流的結尾),則表示該字符串僅包含一個雙精度值。
std::string line;
while(!getline(std::cin, line) || !checkForDouble(line))
std::cout << "Please enter a double instead" << std::endl;
對於字符,您可以只測試長度 1
std::string line;
while(!getline(std::cin, line) || line.size() != 1)
std::cout << "Please enter a double instead" << std::endl;
如果你想讀的只有1個字符,並盡快為字符鍵入了繼續,那么你將不得不使用的平台相關的功能(C ++不會將它們作為標准功能)。 例如,注意 windows 的conio.h文件,它具有_getch
函數。 在 unix 系統上, ncurses提供了這樣的功能。
cin >> _double
總是cin >> _double
你一個double,無論他們輸入的是“42”、“0”還是“mary had a little lamb”。 您需要將用戶輸入讀取為字符串,然后測試該字符串以查看它是否為雙精度值。 如果 sscanf 無法將輸入字符串轉換為所需類型,它將返回 0:
cout << "Please enter a DOUBLE:\n" << endl;
string s;
cin >> s;
if( !sscanf(s.c_str(), "%lf", &_double) )
{
done = false;
cout << "Not a number, sparky. Try again." << endl;
continue;
}
此外,像您這樣帶有前導下划線的標識符由語言保留。 不要養成像_double
這樣命名的習慣——總有一天,它們可能不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.