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)、stol (string to unsigned long)、stoull (string to unsigned long long)。值得注意的是它的缺失是stou (string to unsigned)函数。是不是有什么原因不需要它,而所有其他的都需要呢?
发布于 2012-01-04 01:24:54
最恰当的答案是C库没有对应的“strtou
”,C++11字符串函数都是对C库函数的简单封装:std::sto*
函数镜像strto*
,而std::to_string
函数使用sprintf
。
编辑:正如KennyTM所指出的,stoi
和stol
都使用strtol
作为底层转换函数,但仍然很难理解为什么存在使用strtoul
的stoul
,却没有相应的stou
。
发布于 2012-01-04 01:05: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
,只是使用了不同的范围检查;但是由于它已经存在,所以不需要担心具体如何实现它。)
发布于 2020-02-19 23:49:32
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位long vs 32位int,而且还适用于32位long vs 32位int。
在64位长的情况下,~0xffffffffl将变为0xffffffff00000000,因此将查看是否设置了前32位中的任何一位。对于32位长,it ~0xffffffffl变为0x00000000,掩码检查将始终为零。
https://stackoverflow.com/questions/8715213
复制相似问题