C++ std::stoi 异常:无效参数

Posted

技术标签:

【中文标题】C++ std::stoi 异常:无效参数【英文标题】:C++ std::stoi Exception: Invalid Argument 【发布时间】:2018-06-23 10:04:47 【问题描述】:

我正在编写一个程序,它根据两个颜色十六进制代码计算平均颜色十六进制代码。 例如:我们有两个十六进制代码#15293E 和#012549 的控制台输入。

然后它计算平均十六进制代码 - #0B2743

所以,我的主要问题是当我使用函数 std::stoi 从字符串转换为 int 时 它给了我一个无效论点的例外。 这是我目前写的代码

#include "stdafx.h"
#include <stdexcept>
#include <iostream>
#include <string>

#define CONSOLE_LOG(x) std::cout << x
#define HEX_LEN 6
#define RGB_LEN 2

void enterHexCodes(std::string& hC1, std::string& hC2)

    bool isCorrectLen = false;
    do 
        std::cin >> hC1 >> hC2;
        if (hC1.length() != HEX_LEN + 1 || hC2.length() != HEX_LEN + 1)
         
            CONSOLE_LOG("ERROR!: Hex code should be no more than 7 symbols" << std::endl);
         else  isCorrectLen = true; 
     while (!isCorrectLen);


void getAvgHex(std::string& s, std::string& s1)

    int r, g, b,
        r1, g1, b1;

    std::string R = s.substr(1, RGB_LEN);
    std::string G = s.substr(3, RGB_LEN);
    std::string B = s.substr(5, RGB_LEN);

    std::string R1 = s1.substr(1, RGB_LEN);
    std::string G1 = s1.substr(3, RGB_LEN);
    std::string B1 = s1.substr(5, RGB_LEN);

    try 
        r = std::stoi(R), g = std::stoi(G), b = std::stoi(B);
        //std::stoi(R1), std::stoi(G1), std::stoi(B1);
    
    catch (std::invalid_argument& e) 
        std::cout << "Invalid argument" << std::endl;
    
    catch (std::out_of_range& e) 
        std::cout << "Out of range" << std::endl;
    
    catch (...) 
        std::cout << "Something else" << std::endl;
    

    std::cout << r << " " << g << " " << b;



int main()

    std::string hexCode1, hexCode2;

    enterHexCodes(hexCode1, hexCode2);

    getAvgHex(hexCode1, hexCode2);

    std::cin.get(); std::cin.get(); std::cin.get();
    return 0;

我该如何解决这个异常,或者有没有其他方法可以将字符串转换为 int?

【问题讨论】:

【参考方案1】:

尝试添加转换基础 十六进制示例:std::stoi (str_hex,nullptr,16);

【讨论】:

成功了,非常感谢。你能解释一下为什么它有效,为什么我的方法无效? 欢迎。如果你不通过基数,那么函数需要一个十进制数字字符串 如果不指定基数,则输入中的前几个字符确定基数。如果文本以非 0 数字开头,则以 10 为底。如果以 0 开头,后跟 x 或 X,则为十六进制。如果它以 0 开头,后跟 x 或 X 以外的其他内容,则它是八进制的。所以“15293E”被解释为十进制常量,最后的E 无效。 “012549”是八进制常数,末尾的9无效。

以上是关于C++ std::stoi 异常:无效参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 std::stoi() 验证 int 输入?

C++ 困境:关于 std::stoi

cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员

在 std::stoi 比较字节 0x90 上发现错误

未处理的异常:将无效参数传递给认为无效参数致命的函数。在插入排序中[重复]

在 C++ 中使用带基数的 wtoi