如何解决?(语言-c++)

已知的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;
}
  • 以下回答由chatgpt基于相关博客总结生成:

    我需要编写一个C++程序,能够将输入的字符串转换为整数,并且需要对可能发生的异常进行处理,确保程序不会因为输入不符合要求而直接退出。为了实现这个功能,我可以使用std::stoi函数将输入的字符串转换为整数,同时使用try-catch语句来捕获可能抛出的异常,并根据异常类型进行相应的处理。

    具体步骤如下:

    1. 在程序中使用std::stoi函数将输入的字符串转换为整数,代码如下:
    #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;
    }
    
    1. 在try语句块中使用catch语句来捕获可能抛出的异常。当输入的字符串不是数字时,std::invalid_argument异常会被抛出;当输入的数字串过长时,std::out_of_range异常会被抛出。在catch语句块中,我使用cout语句输出异常信息,并在程序继续运行时防止程序崩溃,以便用户能够继续输入。

    2. 为了使程序更具健壮性,我可以使用循环语句来实现反复输入的功能,直到用户输入满足要求的字符串为止。代码如下:

    #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;
    }
    
    1. 最后,我还可以使用typedef关键字和函数指针来自定义一个异常处理函数,使程序更加模块化和可读性更高。代码如下:
    #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;
}