我最近从C迁移到了C++,对字符串有一点困惑。字符串不再是过去的样子了,就像在中一样,不仅仅是以'\0‘结尾的字符数组。我还没有找到这个问题的真正答案,那么您可以在多大程度上将std::string类视为C-Strings?
例如:如果我知道一个字符串中的某个地方有一个数字,让这个字符串为ireallylike314
,在C中,我可以使用strtol(string + 10, NULL, 10)
来获得这个数字。如果这不起作用,有没有办法像C字符串一样使用std::string?
发布于 2015-03-18 00:39:18
使用c_str()
。
strtol(string.c_str() + 10, NULL, 10);
发布于 2015-03-18 00:50:30
如果您想从std::string
获取C样式字符串,那么如前所述,使用c_str()
方法。但是,这个特定问题的另一个解决方案是使用stol
而不是strtol
。
发布于 2015-03-18 01:09:53
虽然stol
(本身)并不支持您想要的内容,但我认为我会将它与substr
结合使用,以获得所需的结果:
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));
结果:
628
不过,这有好的地方,也有坏的地方。不好的一面是,它创建了一个全新的string对象来保存输入字符串之外的数字。从好的方面来说,它提供了对要转换的位数的更多控制,所以如果(例如)您只想转换字符串的前两位(即使在本例中,它们后面跟着更多的位数),您也可以很容易地完成这项工作:
std::cout << 2 * stol(in.substr(11, 2));
结果:
62
在相当多的情况下,这可能在多大程度上适用于您,这在很大程度上取决于您的实现是否包括短串优化。如果是这样的话,创建一个(小)字符串通常足够便宜,从而使其变得非常合理。如果不是这样,用来创建临时字符串对象作为substr
返回值的堆分配可能会比您想要付出的代价更高。
https://stackoverflow.com/questions/29104707
复制相似问题