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 输入?
cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员