如何检查十进制转十六进制结果仅含A、B、C、D、E、F、1、0字符?
解决十六进制字符校验问题
嘿,我懂你现在的困扰——已经完成了字符串转十进制的步骤,现在需要把这个十进制数转成十六进制,还要检查转出来的十六进制字符串是不是只包含A、B、C、D、E、F、0、1这些字符,最后设置一个布尔标志位对吧?我来帮你把这段代码补全,顺便把关键逻辑讲清楚。
首先,我们需要先把十进制数转换成十六进制字符串,这里用stringstream会很方便,还能直接控制输出大写的十六进制字母。然后遍历这个十六进制字符串的每一个字符,逐个检查是否在允许的范围内,最后根据检查结果设置布尔标志。
下面是完整的代码实现:
#include <iostream> #include <string> #include <sstream> #include <cctype> // 用于isxdigit函数 using namespace std; string solution(string &S) { // 字符串转十进制整数 int n = stoi(S); cout << "stoi(\"" << S << "\") is " << n << '\n'; // 十进制转十六进制字符串(大写) stringstream ss; ss << uppercase << hex << n; string hex_str = ss.str(); cout << "Hexadecimal: " << hex_str << '\n'; // 初始化布尔标志位,默认假设符合要求 bool is_valid = true; // 定义允许的字符集合 const string allowed_chars = "ABCDEF01"; // 遍历十六进制字符串的每个字符 for (char c : hex_str) { // 先检查是不是十六进制字符(可选,但能过滤非法字符) if (!isxdigit(c)) { is_valid = false; break; } // 再检查是否在允许的字符列表里 if (allowed_chars.find(c) == string::npos) { is_valid = false; break; } } // 输出标志位结果 cout << "Is valid hex? " << boolalpha << is_valid << '\n'; // 这里可以根据需求返回相应内容,比如返回十六进制字符串或者其他 return hex_str; } int main() { string test_str = "255"; // 测试用例,转十六进制是FF,会被判定为无效 string test_str2 = "17"; // 转十六进制是11,有效 solution(test_str); solution(test_str2); return 0; }
关键逻辑说明:
- 十进制转十六进制:用
stringstream的hex操纵符实现转换,uppercase确保输出的字母是大写(和你要求的A-F匹配)。 - 字符校验:
- 先用
isxdigit快速过滤掉非十六进制字符(虽然从int转过来的十六进制理论上不会有,但加一层更稳妥)。 - 然后用
string::find检查当前字符是否在我们定义的允许字符集合里,如果找不到(返回string::npos),就把标志位设为false并跳出循环。
- 先用
- 布尔标志位:默认设为
true,只要发现一个不符合的字符就立刻设为false,避免不必要的遍历。
另外提个小注意:stoi只能处理int范围内的数,如果你的输入字符串可能超出int的范围(比如很大的数),可以换成stoll(转long long),对应的变量类型也改成long long,这样兼容性更好。
内容的提问来源于stack exchange,提问作者lotto 1988
相关产品推荐
相关产品推荐

