C++中将char的实际数值(非ASCII地址)转换为size_t的正确方法
正确规范的实现方案
对于单个数字char转对应数值的size_t类型,最简洁且符合C++标准的做法是直接利用数字字符的编码特性:
size_t num = static_cast<size_t>(content[j] - '0');
原理说明
- C++标准明确规定:数字字符
'0'到'9'的编码值是连续递增的,因此任意数字字符减去基准字符'0'的结果,就是该字符对应的实际整数值,该特性不受平台字符集差异影响,可移植性有保障。 - 相比你现有转string再调用
std::stoi的实现,该方式无需额外的内存分配和函数调用,性能和简洁性都更好。
完整优化代码
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <cctype> // 用于isdigit校验 int main() { std::vector<size_t> singleDigits { 1, 4, 6, 8, 9 }; std::string content = "1234"; for (char c : content) { // 范围for写法更简洁 // 可选校验:确保当前字符是数字,避免非法输入导致异常结果 if (!std::isdigit(static_cast<unsigned char>(c))) { std::cout << c << " is not a digit" << std::endl; continue; } size_t num = static_cast<size_t>(c - '0'); auto iterator = std::find(singleDigits.begin(), singleDigits.end(), num); if (iterator == singleDigits.end()) { std::cout << num << " Not found" << std::endl; } else { std::cout << num << " was found" << std::endl; } } }
额外注意事项
- 如果你的业务场景不能保证输入的
content里全是数字字符,必须加上述的std::isdigit校验,否则非数字字符减'0'得到的结果会超出0~9的范围,得到不符合预期的size_t值。 - 调用
std::isdigit时要把参数强转为unsigned char,是为了避免char为有符号类型时,传入负值触发未定义行为。
内容的提问来源于stack exchange,提问作者Samuel Wahlberg
相关产品推荐
相关产品推荐

