为什么使用 std::stod 将 std::double 转换为 std::string 会出现异常?

Why is Converting std::double to std::string using std::stod giving an exception?

我正在尝试通过我的代码中定义的以下方法完成添加,但是在提交用户输入后,程序只是 return 一个异常而不是添加。

异常:

terminate called after throwing an instance of 'std::invalid_argument' what(): stoi

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

代码:

#include <iostream>
#include <string>
using namespace std;
bool inputValidation_F(string userInput_VSTR1, string userInput_VSTR2)
{
    for (int inputChecker_V = 0; inputChecker_V < userInput_VSTR1.length() || userInput_VSTR1.length() && inputValidation_F; inputChecker_V ++)
        if (!(userInput_VSTR1[inputChecker_V] || userInput_VSTR2[inputChecker_V] >= 48 && userInput_VSTR1[inputChecker_V] || userInput_VSTR2[inputChecker_V] <= 57))
        return false;
    return true;
}
void mainMenu_F();
void userChoice_F();
void calCulations_F(double, double);
void resultAddition_F(double, double);
int main()
{
    mainMenu_F();
}
void mainMenu_F()
{
    cout << "Main Menu:" << '\n';
    cout << "-------------------------------" << '\n';
    cout << "Enter + for Addition" << '\n';
    cout << "-------------------------------" << '\n';
    cout << "Choose any Option from the List" << '\n';
    cout << "-------------------------------" << '\n';
    userChoice_F();
}
void userChoice_F()
{
    double addition_V_1;
    double addition_V_2;
    char uChoice_V;
    cin >> uChoice_V;
    switch (uChoice_V)
    {
    case '+':
    cout << "Addition: Enter the first value: "; cin >> addition_V_1;
    cout << "Addition: Enter the second value: "; cin >> addition_V_2;
    calCulations_F(addition_V_1, addition_V_2);
    }
}
void calCulations_F(double addition_V_1, double addition_V_2)
{
    string addition_V_1STR;
    string addition_V_2STR;
    addition_V_1 = stod (addition_V_1STR);
    addition_V_2 = stod (addition_V_2STR);
    bool additionChecker_F;
    additionChecker_F = inputValidation_F (addition_V_1STR, addition_V_2STR);
    if (!additionChecker_F)
        additionChecker_F = false;
    else resultAddition_F (addition_V_1, addition_V_2);
}
void resultAddition_F(double addition_V_1, double addition_V_2)
{
    double resultAddition_V = (addition_V_1 + addition_V_2);
    cout << "The result for the addition of the Entered values is: [" << resultAddition_V << "]" << '\n';
}

terminate called after throwing an instance of 'std::invalid_argument' what(): stoi

原因在这里:

void userChoice_F() {
    .
    .
    // passing two 'double' parameters
    calCulations_F(addition_V_1, addition_V_2);
}

void calCulations_F(double addition_V_1, double addition_V_2)
{
    double resultAddition_V; // redundant
    string addition_V_1STR; // created, uninitialized
    string addition_V_2STR; // created, uninitialized

    // you're overriding the parameters here
    addition_V_1 = stoi (addition_V_1STR); // convert ? to double
    addition_V_2 = stoi (addition_V_2STR); // again here
                // better put stod() with a valid string here
    .
    .
}

首先,您尝试将字符串转换为整数并将其存储在 double 中,这不是一个非常有用的想法,请尝试改为 std::stod()。但是仍然会失败,因为 addition_V_1STRaddition_V_2STR 是空的(以前从未分配过),它们在这里没用。

其他问题:

  1. 在第 6 行中,您将整数与 long unsigned 整数进行比较,这是一种不好的做法。

  2. 在同一行,userInput_VSTR1.length() && inputValidation_F永远不会为NULL。

  3. resultAddition_V在这里是多余的。

我认为这个解决方案将解决您的问题和误解,您的代码已编辑,如果您有任何问题,请在评论或聊天部分提问,我很乐意为您提供帮助。

#include <iostream>
#include <string>
#include <limits>
using namespace std;
bool isvalid_(string);
bool inputValidation_F(string userInput_VSTR1, string userInput_VSTR2)
{
    for (int inputChecker_V = 0; inputChecker_V < userInput_VSTR1.length() || userInput_VSTR1.length() && inputValidation_F; inputChecker_V ++)
        if (!(userInput_VSTR1[inputChecker_V] || userInput_VSTR2[inputChecker_V] >= 48 && userInput_VSTR1[inputChecker_V] || userInput_VSTR2[inputChecker_V] <= 57))
        return false;
    return true;
}
void mainMenu_F();
void userChoice_F();
void calCulations_F(double, double);
void resultAddition_F(double, double);
int main()
{
    mainMenu_F();
}
void mainMenu_F()
{
    cout << "Main Menu:" << '\n';
    cout << "Enter + for Addition" << '\n';
    userChoice_F();
}
void userChoice_F()
{
    double addition_V_1, addition_V_2;
    char uChoice_V;
    cin >> uChoice_V;
    switch (uChoice_V)
    {
    case '+':
    cout << "Addition: Enter the first value: "; cin >> addition_V_1;
    cout << "Addition: Enter the second value: "; cin >> addition_V_2;
    while(!isvalid_("Ops! Entered invalid value, Try again."));
    calCulations_F(addition_V_1, addition_V_2);
    break;
    default:
        cout << "Invalid Choice," << '\n';
    }
}
void calCulations_F(double addition_V_1, double addition_V_2)
{
    if (!inputValidation_F)
        bool isvalid_ = 0;
    else resultAddition_F (addition_V_1, addition_V_2);
}
void resultAddition_F(double addition_V_1, double addition_V_2)
{
    double resultAddition_V = (addition_V_1 + addition_V_2);
    cout << "The result for the addition of the Entered values is: [" << resultAddition_V << "]" << '\n';
}
bool isvalid_(string err_msg)
{
    if(cin.rdstate())
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>:: max(), '\n');
        system("cls");
        cout << "Invalid number entry! Try again from the Beginning." << '\n';
        mainMenu_F();
        return false;
    }
    return true;
}