在std :: string上使用strtol

时间:2015-03-17 16:36:12

标签: c++ string

我最近从C迁移到C ++,并且对字符串有点混淆。字符串不再是以前的字符串,而不仅仅是带有终止'\ 0'的字符数组。 我还没有找到这个问题的真正答案,那么你可以在多长时间内处理像C-Strings这样的std :: string类?

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

6 个答案:

答案 0 :(得分:4)

使用c_str()

strtol(string.c_str() + 10, NULL, 10);

答案 1 :(得分:2)

如果您想从std::string获取C风格的字符串,那么如上所述使用c_str()方法。但是,针对此特定问题的另一种解决方案是使用stol而不是strtol

答案 2 :(得分:2)

虽然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

这既有好处也有坏处。不好的一面是,它会创建一个全新的字符串对象来保存输入字符串中的数字。从好的方面来说,它可以更好地控制要转换的数字位数,所以如果(例如)你只想转换字符串的前两位数字(即使在这种情况下,它们是&#39;重新跟随更多数字)你也可以很容易地做到这一点:

std::cout << 2 * stol(in.substr(11, 2));

结果:

62

在很多情况下,这对您来说可能实用的程度在很大程度上取决于您的实现是否包含短字符串优化。如果是这样,创建(小)字符串通常足够便宜,使其完全合理。如果它没有,那么用于创建临时字符串对象作为substr的返回值的堆分配可能比您想要支付的价格更高。

答案 3 :(得分:1)

类似C的方式:

long n = std::strtol( string.c_str() + offset, nullptr, 10 );
// sets ERRNO on error and returns value by saturating arithmetic.

Java-ish方式:

long n = std::stol( string.substr( offset, std::string::npos ) );
// exception (no return value) and perhaps ERRNO is set on error.

溪流方式:

long n = 0;
std::istringstream( string ).ignore( offset ) >> n;
// n is unmodified on error

语言环境方式:

long n = 0;
std::ios_base fmt; // Use default formatting: base-10 only.
std::ios::iostate err = {};
std::num_get< char, std::string::iterator >()
            .get( string.begin() + offset, string.end(), fmt, err, n );
// err is set to std::ios::failbit on error

答案 4 :(得分:0)

  

字符串不再像过去那样,不仅如此   带有终止'\ 0'的char数组。

你错了。在C ++中,字符串的定义方式相同。在两种语言中,字符串都定义为

  

字符串是以和结尾的连续字符序列   包括第一个空字符。

您将字符串std::string(或std::basic_string)与不同的字符串混合在一起。

  

例如:如果我知道字符串中有某个数字,那就让我们知道   string是ireallylike314,在C中我可以使用strtol(string [10],NULL,   10)得到那个数字

你错了。有效的函数调用看起来像

strtol( &string[11], NULL, 10)

strtol( string + 11, NULL, 10)

使用成员函数std::string或(从C ++ 2011开始)可以为类c_str()的对象调用的相同函数data()

例如

std::string s( "ireallylike314" );

auto x = std::strtol( s.c_str() + 11, NULL, 10 );

auto x = std::strtol( s.data() + 11, NULL, 10 );

答案 5 :(得分:0)

这可能超出了问题的范围,但由于您正在迁移到C ++并且您似乎对std :: string感到困惑,因此您可能会发现以下内容非常有用。

拥有std :: string的重点不是像C-Strings一样使用它(你可以这样做,就像之前的答案所示)。您可以获得std :: string功能的更多优势。例如,它是C++ container,有函数可以获得子串,比较字符串等...

使用std :: string而不是C-Strings,字符串操作通常要容易得多。

例如,请参见http://www.cplusplus.com/reference/string/string/的功能。