为什么没有性病?

C + + 11增加了一些新的字符串转换函数:

Http://en.cppreference.com/w/cpp/string/basic_string/stoul

它包括 stoi (string to int) ,stol (string to long) ,stoll (string to long long) ,stoul (string to unsigned long) ,stoull (string to unsigned long)。值得注意的是没有 stou (字符串到无符号)函数。是否有某种原因使得它不需要而其他所有的都需要?

相关资料: C + + 11中没有“ sto { short,unsignedshort }”函数吗?

23549 次浏览

我不知道为什么 stoi存在而 stou不存在,但是 stoul和假设的 stou之间唯一的区别就是检查结果是否在 unsigned的范围内:

unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) {
unsigned long result = std::stoul(str, idx, base);
if (result > std::numeric_limits<unsigned>::max()) {
throw std::out_of_range("stou");
}
return result;
}

(同样,stoi也类似于 stol,只是范围检查不同; 但是由于它已经存在,所以不必担心如何实现它。)

最恰当的回答是,C 库没有对应的 strtou & rdquo; ,C + + 11字符串函数都只是 C 库函数周围几乎不加掩饰的包装器: std::sto*函数镜像 strto*,而 std::to_string函数使用 sprintf


编辑: 正如 KennyTM 所指出的,stoistol都使用 strtol作为底层转换函数,但是仍然不明白为什么存在使用 strtoulstoul,却没有相应的 stou

unsigned long ulval = std::stoul(buf);
unsigned long mask = ~0xffffffffl;
unsigned int uival;
if( (ulval & mask) == 0 )
uival = (unsigned int)ulval;
else {
...range error...
}

使用掩码以掩码中所表示的位的预期值大小来实现这一点,将使这种方法适用于64位长度的整数和32位整数,也适用于32位长度的整数和32位整数。

对于64位长度,~ 0xffffffl 将变为0xffffffff0000000,因此将查看是否设置了前32位中的任何一位。对于32位长度,它 ~ 0xffffffl 变为0x00000000,掩码检查总是为零。