已知的std::stoi(const std::string& str)函数可以把字符串转为整数,如果输入的字符串不是数字或者数字串过长,会抛出中std::logic_failure的std::invalid_argument子类 或std::out_of_range子类 异常。
写一个允许用户输入字符串,输出对应整数的程序。
要求:除非用户想退出,否则输入的字符串不符合要求也可以正常继续进行。
可以使用 try catch 的方式进行转换并捕获错误,这样程序就能在 while 里面一直运行。示例代码如下:
#include <iostream>
#include <string>
#include <stdexcept>
int main() {
std::string input;
while (true) {
std::cout << "请输入一个字符串,或输入 q 退出: ";
std::cin >> input;
if (input == "q") {
break;
}
try {
int number = std::stoi(input);
std::cout << "对应的整数为: " << number << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << "无法转为整数。" << std::endl;
} catch (const std::out_of_range& e) {
std::cout << "超出整数可表示的范围。" << std::endl;
}
}
return 0;
}
我需要编写一个C++程序,能够将输入的字符串转换为整数,并且需要对可能发生的异常进行处理,确保程序不会因为输入不符合要求而直接退出。为了实现这个功能,我可以使用std::stoi函数将输入的字符串转换为整数,同时使用try-catch语句来捕获可能抛出的异常,并根据异常类型进行相应的处理。
具体步骤如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入一个整数字符串:" << endl;
cin >> str;
try {
int num = stoi(str);
cout << "转换后的整数为:" << num << endl;
}
catch (invalid_argument& e) {
cout << "发生了无效参数异常:" << e.what() << endl;
}
catch (out_of_range& e) {
cout << "发生了越界异常:" << e.what() << endl;
}
return 0;
}
在try语句块中使用catch语句来捕获可能抛出的异常。当输入的字符串不是数字时,std::invalid_argument异常会被抛出;当输入的数字串过长时,std::out_of_range异常会被抛出。在catch语句块中,我使用cout语句输出异常信息,并在程序继续运行时防止程序崩溃,以便用户能够继续输入。
为了使程序更具健壮性,我可以使用循环语句来实现反复输入的功能,直到用户输入满足要求的字符串为止。代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num;
bool flag = false;
do {
string str;
cout << "请输入一个整数字符串:" << endl;
cin >> str;
try {
num = stoi(str);
flag = true;
}
catch (invalid_argument& e) {
cout << "发生了无效参数异常:" << e.what() << endl;
}
catch (out_of_range& e) {
cout << "发生了越界异常:" << e.what() << endl;
}
} while (!flag);
cout << "转换后的整数为:" << num << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
typedef void(*ExceptionHandler)(exception&);
void printError(exception& e) {
cout << "发生了异常:" << e.what() << endl;
}
void handleException(ExceptionHandler handler, exception& e) {
if (handler != nullptr) {
handler(e);
}
}
int main() {
int num;
bool flag = false;
do {
string str;
cout << "请输入一个整数字符串:" << endl;
cin >> str;
try {
num = stoi(str);
flag = true;
}
catch (exception& e) {
handleException(printError, e);
}
} while (!flag);
cout << "转换后的整数为:" << num << endl;
return 0;
}
在这个程序中,我通过定义ExceptionHandler函数指针和printError异常处理函数来实现异常处理的模块化。在handleException函数中,我通过传入ExceptionHandler函数指针和exception类型的对象来调用特定的异常处理函数,这样代码结构更加清晰,易于理解和维护。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入一个整数字符串:" << endl;
cin >> str;
try {
int num = stoi(str);
cout << "转换后的整数为:" << num << endl;
}
catch (invalid_argument& e) {
cout << "发生了无效参数异常:" << e.what() << endl;
}
catch (out_of_range& e) {
cout << "发生了越界异常:" << e.what() << endl;
}
return 0;
}