我有一个代码我让用户输入运费的重量。我将这个数字转换为数学的双倍,并且使用std :: stod()完美地工作;当用户未输入有效条目时,会出现此问题。我是C ++的新手,在C#中我使用了try parse。在用户输入可以切换成双人的实际号码之前,我怎么能有一个循环来询问重量?
我确信这是一个基本问题,如果是,我道歉!
答案 0 :(得分:2)
stod
函数在未正确解析时抛出异常。所以你可以写:
double d;
for (;;)
{
std::string s;
std::getline(std::cin, s);
if ( !std::cin )
{ d = 0; break; } // or some other handling that exits the loop
try
{
d = std::stod(s);
}
catch(...)
{
std::cout << "Invalid input, try again.\n");
}
}
答案 1 :(得分:1)
您不必先在字符串中输入值。您可以直接阅读双重内容。如果用户输入值不是double,则会使用于检查值的流无效,您可以检查:
double
translatedNumber;
if(input >> translatedNumber){
std::cout << "number is " << translatedNumber << '\n';
}
else{
std::cout << "invalid input\n";
input.clear();
// get rid of the invalid input in the stream
std::string inputEater;
input >> inputEater;
}
或者您可以读取字符串,并尝试翻译它。 stod
通过抛出异常来表示错误,您可以捕获它抛出的异常并适当地处理它们:
std::string
userInput;
double
translatedNumber;
input >> userInput;
try{
// stod throws either invalid_argument or
// out_of_range if it can't convert the string
translatedNumber = std::stod(userInput);
std::cout << "number is " << translatedNumber << '\n';
}
catch(std::invalid_argument &){
std::cout << "invalid input\n";
}
catch(std::out_of_range &){
std::cout << "input out of range representable by doubles\n";
}
在这两个示例中,input
变量用作std::cin
变量的替代,因为我使用在线编译器Coliru作为示例。
这两种可能的解决方案的现场演示是here,正如您所看到的,这两种方法的输出是:
第一
13 -> number is 13
banana -> invalid input
第二
4023.9 -> number is 4023.9
sandwich -> invalid input
43e508 -> input out of range representable by doubles
答案 2 :(得分:0)
你可以这样做的一种方式:
std::regex pattern ("^0$|^[1-9][0-9]*$");
if(regex_match(input, pattern))
cout << "matched\n";
else
cout << "not matched\n";
return 0;
}
其他方式你可以这样做:
string::const_iterator it = str.begin();
while(it != str.end() && isdigit(*it))
{
it++;
}
if (!str.empty() && it == str.end())
cout << "not a string";
else
cout << "valid";
我帮助您使用此source