我最近从 C 迁移到 C++,对字符串有一些困惑。字符串不再是以前的样子了,不仅仅是带有终止符 ' ' 的 char 数组。 我还没有找到这个问题的真正答案,那么你能在多大程度上像 C-Strings 一样对待 std::string 类呢?
例如:如果我知道字符串中某处有一个数字,则将该字符串设为
ireallylike314
,在 C 中我可以使用 strtol(string + 10, NULL, 10)
来获取该数字。
而且,如果这不起作用,有没有办法像 C 字符串一样使用 std::string ?
使用
c_str()
。
strtol(string.c_str() + 10, NULL, 10);
虽然
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
这既有好处也有坏处。不好的一面是,它创建了一个全新的字符串对象来保存输入字符串中的数字。从好的方面来说,它可以更好地控制要转换的位数,因此,如果(例如)您只想转换字符串中的前两位数字(即使在本例中,它们后面跟着更多数字)你也可以很容易地做到这一点:
std::cout << 2 * stol(in.substr(11, 2));
结果:
62
在相当多的情况下,这对您来说实用的程度在很大程度上取决于您的实现是否包括短字符串优化。如果确实如此,创建一个(小)字符串通常足够便宜,足以使这完全合理。如果没有,用于创建临时字符串对象作为
substr
返回值的堆分配可能会比您想要支付的价格更高。
字符串不再是以前的样子了,不仅仅是 以 ' ' 结尾的 char 数组。
你错了。在 C++ 中,字符串的定义方式相同。在这两种语言中,字符串的定义如下:
字符串是以 and 结尾的连续字符序列 包括第一个空字符。您将不同的字符串与类
std::string
(或
std::basic_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 );
long n = std::strtol( string.c_str() + offset, nullptr, 10 );
// sets ERRNO on error and returns value by saturating arithmetic.
Java 式的方式:
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
使用 std::string 的目的不是像 C-Strings 那样使用它(ofc 你可以这样做,就像前面的答案所示)。您可以利用 std::string 功能的更多优势。例如它是一个
C++容器,有获取子字符串、比较字符串等功能...
使用 std::string 进行字符串操作通常比使用 C-String 更容易。参见示例
http://www.cplusplus.com/reference/string/string/ 了解其功能。