C ++ std :: stod。如何让用户输入一个号码?

时间:2015-08-30 06:12:17

标签: c++

我有一个代码我让用户输入运费的重量。我将这个数字转换为数学的双倍,并且使用std :: stod()完美地工作;当用户未输入有效条目时,会出现此问题。我是C ++的新手,在C#中我使用了try parse。在用户输入可以切换成双人的实际号码之前,我怎么能有一个循环来询问重量?

我确信这是一个基本问题,如果是,我道歉!

3 个答案:

答案 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