首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::string上strtol的用法

std::string上strtol的用法
EN

Stack Overflow用户
提问于 2015-03-18 00:36:12
回答 6查看 3.9K关注 0票数 4

我最近从C迁移到了C++,对字符串有一点困惑。字符串不再是过去的样子了,就像在中一样,不仅仅是以'\0‘结尾的字符数组。我还没有找到这个问题的真正答案,那么您可以在多大程度上将std::string类视为C-Strings?

例如:如果我知道一个字符串中的某个地方有一个数字,让这个字符串为ireallylike314,在C中,我可以使用strtol(string + 10, NULL, 10)来获得这个数字。如果这不起作用,有没有办法像C字符串一样使用std::string?

EN

回答 6

Stack Overflow用户

发布于 2015-03-18 00:39:18

使用c_str()

代码语言:javascript
运行
复制
strtol(string.c_str() + 10, NULL, 10);
票数 3
EN

Stack Overflow用户

发布于 2015-03-18 00:50:30

如果您想从std::string获取C样式字符串,那么如前所述,使用c_str()方法。但是,这个特定问题的另一个解决方案是使用stol而不是strtol

票数 2
EN

Stack Overflow用户

发布于 2015-03-18 01:09:53

虽然stol (本身)并不支持您想要的内容,但我认为我会将它与substr结合使用,以获得所需的结果:

代码语言:javascript
运行
复制
std::string in = "ireallylike314";

// extract number and print it out multiplied by 2 to show we got a number
std::cout << 2 * stol(in.substr(11));

结果:

代码语言:javascript
运行
复制
628

不过,这有好的地方,也有坏的地方。不好的一面是,它创建了一个全新的string对象来保存输入字符串之外的数字。从好的方面来说,它提供了对要转换的位数的更多控制,所以如果(例如)您只想转换字符串的前两位(即使在本例中,它们后面跟着更多的位数),您也可以很容易地完成这项工作:

代码语言:javascript
运行
复制
std::cout << 2 * stol(in.substr(11, 2));

结果:

代码语言:javascript
运行
复制
62

在相当多的情况下,这可能在多大程度上适用于您,这在很大程度上取决于您的实现是否包括短串优化。如果是这样的话,创建一个(小)字符串通常足够便宜,从而使其变得非常合理。如果不是这样,用来创建临时字符串对象作为substr返回值的堆分配可能会比您想要付出的代价更高。

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

https://stackoverflow.com/questions/29104707

复制
相关文章

相似问题

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