为什么使用 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_1STR
和 addition_V_2STR
是空的(以前从未分配过),它们在这里没用。
其他问题:
在第 6 行中,您将整数与 long unsigned
整数进行比较,这是一种不好的做法。
在同一行,userInput_VSTR1.length() && inputValidation_F
永远不会为NULL。
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;
}
我正在尝试通过我的代码中定义的以下方法完成添加,但是在提交用户输入后,程序只是 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_1STR
和 addition_V_2STR
是空的(以前从未分配过),它们在这里没用。
其他问题:
在第 6 行中,您将整数与
long unsigned
整数进行比较,这是一种不好的做法。在同一行,
userInput_VSTR1.length() && inputValidation_F
永远不会为NULL。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;
}