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 long)。值得注意的是它是一个stou(字符串到无符号)函数。有什么理由不需要它,但所有其他的都是吗?
答案 0 :(得分:25)
最简单的答案是C库没有相应的“strtou
”,而C ++ 11字符串函数都只是围绕C库函数的薄弱包装:std::sto*
函数镜像strto*
,std::to_string
函数使用sprintf
。
编辑:正如KennyTM所指出的那样,stoi
和stol
都使用strtol
作为基础转化函数,但是当存在使用stoul
的{{1}}时仍然是神秘的strtoul
,没有相应的stou
。
答案 1 :(得分:20)
我不知道为什么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
,只是使用不同的范围检查;但由于它已经存在,因此无需担心如何实现它。)
答案 2 :(得分:0)
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位长的情况下,〜0xffffffffl将变为0xffffffff00000000,因此将查看是否设置了前32位。如果使用32位长,则〜0xffffffffl变为0x00000000,掩码检查将始终为零。