std::string上strtol的用法 我最近从C迁移到C++,对字符串有点混淆。字符串不再是以前的字符串了,就像在中一样,不再只是带有终止“\0”的字符数组。 我还没有找到这个问题的真正答案,那么你能把std::string类当作C-Strings处理到什么程度呢

std::string上strtol的用法 我最近从C迁移到C++,对字符串有点混淆。字符串不再是以前的字符串了,就像在中一样,不再只是带有终止“\0”的字符数组。 我还没有找到这个问题的真正答案,那么你能把std::string类当作C-Strings处理到什么程度呢,c++,string,C++,String,例如:如果我知道字符串中的某个地方有一个数字,那么让字符串为ireallylike314,在C语言中,我可以使用strtol(string+10,NULL,10)来获取该数字。 如果这不起作用,有没有办法像C字符串一样使用std::string?使用C\u str() 字符串已经不再是以前的样子了,比如 具有终止“\0”的字符数组 你错了。在C++中,字符串的定义方式相同。在这两种语言中,字符串的定义如下 字符串是以和结尾的连续字符序列 包括第一个空字符 您可以将不同的字符串与classstd:

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

使用
C\u str()

字符串已经不再是以前的样子了,比如 具有终止“\0”的字符数组

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

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

您可以将不同的字符串与class
std::string
(或
std::basic_string
)混合使用

例如:如果我知道字符串中某处有一个数字,请让 字符串是ireallylike314,在C中我可以使用strtol(字符串[10],NULL, 10) 去拿那个号码

你错了。有效的函数调用如下所示

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

同一个函数,您可以调用一个类的对象<代码> STD::String >使用成员函数<代码> CyString()/<代码>或(从C++ 2011开始)<代码>数据()/代码> < /P> 比如说

std::string s( "ireallylike314" );

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


如果您想从
std::string
获取C样式的字符串,那么如上所述,请使用
C_str()
方法。但是,对于这个特定问题的另一种解决方案是使用“代码> > StrtoL < < /P> < P>这可能超出了问题的范围,但是由于您正在迁移到C++,而且您似乎对STD::string感到困惑,您可能会发现以下有用的。 使用std::string的目的不是像C-string那样使用它(ofc您可以这样做,就像前面的答案所示)。您可以利用std::string功能的更多优势。例如,它是一个,有函数获取子字符串,比较字符串,等等

使用std::String比使用C-String更容易进行字符串操作


参见示例了解其功能。

虽然
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));
不过,这既有优点也有缺点。坏的一面是,它创建了一个全新的string对象来保留输入字符串中的数字。好的一面是,它对要转换的位数提供了更多的控制,因此,如果(例如)您只想转换字符串中的前两个数字(即使在本例中,后面跟着更多的数字),您也可以非常轻松地进行转换:

std::cout << 2 * stol(in.substr(11, 2));
在相当多的情况下,这在多大程度上对您来说是实用的,这在很大程度上取决于您的实现是否包括短字符串优化。如果是这样的话,创建一个(小)字符串通常是非常便宜的,这样做非常合理。如果没有,则创建临时字符串对象作为
substr
返回值的堆分配可能比您想要支付的价格更高。

类似C的方式:

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
long n=0;
std::ios_基本fmt;//使用默认格式:仅限base-10。
std::ios::iostate err={};
std::num_get()
.get(string.begin()+偏移量,string.end(),fmt,err,n);
//err设置为std::ios::failbit on error

string[10]
在C中也做了同样的事情。在本例中,string[10]的工作原理与string+10类似,并在本例中给出该偏移量处的字符串。。还是我错了?
string[10]
代表
*(string+10)
,而不是
(string+10)
。哦,该死的,你是对的。对不起,我弄糊涂了。我将把它改为string+10,用于
std::string
对象。@Mgetz,你读过这个问题了吗?“在C语言中,我可以使用
strtol(string+10,NULL,10)
stol
不起作用,因为它不能直接处理字符串的中间部分。@R.MartinhoFernandes我忘记了,但是你可以使用
substr
方法得到字符串的中间部分。他没有“错”。无论后者与前者的部分实现是否相似,@Lightness在轨道类std::string(或std::basic_string)中竞赛字符串的概念是不同的。如果你检查代码
boost::string_ref
有一个
stol
的实现,这是对维护安全的
strtol
的调用
62
long n = std::strtol( string.c_str() + offset, nullptr, 10 );
// sets ERRNO on error and returns value by saturating arithmetic.
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