c++ - C++ std::stoi 异常:无效参数
问题描述
我正在编写一个程序,它从两个颜色十六进制代码计算平均颜色十六进制代码。例如:我们有两个十六进制代码#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?
解决方案
尝试为十六进制添加转换示例的基础:std::stoi (str_hex,nullptr,16);
推荐阅读
- mysql - 如何使用目标表中的详细信息更新具有子查询匹配的表列?
- android - 有什么方法可以提供一个“容器”来反应以显示反应原生的对话框?
- pandas - 无法过滤数据框列表
- xaml - 如何使 Pivot 中的 PivotItems 像 WrapPanel 一样环绕?
- vbscript - 如何在 W2K12 服务器上使用 asp 获取音乐时长
- docker - gitlab-runner 使用 docker 作为执行器,然后 docker 执行器成功运行另一个 docker 映像,但我无法通过“docker ps -a”找到它
- emacs - Emacs Lisp 中“不可区分”是什么意思?
- python - 在双引号字符串中查找单引号并替换
- vue.js - 更新状态时和 DOM 完全加载后如何调用函数
- python - 使用 Firebase [python] 将 OTP 发送到手机号码