首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么没有std::stou?

为什么没有std::stou?
EN

Stack Overflow用户
提问于 2012-01-04 00:21:32
回答 3查看 20.1K关注 0票数 111

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)函数。是不是有什么原因不需要它,而所有其他的都需要呢?

相关:No "sto{short, unsigned short}" functions in C++11?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-04 01:24:54

最恰当的答案是C库没有对应的“strtou”,C++11字符串函数都是对C库函数的简单封装:std::sto*函数镜像strto*,而std::to_string函数使用sprintf

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

票数 31
EN

Stack Overflow用户

发布于 2012-01-04 01:05:20

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

代码语言:javascript
运行
复制
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,只是使用了不同的范围检查;但是由于它已经存在,所以不需要担心具体如何实现它。)

票数 23
EN

Stack Overflow用户

发布于 2020-02-19 23:49:32

代码语言:javascript
运行
复制
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,掩码检查将始终为零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8715213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档