C++ 从字符串中给定结束索引的字符串复制子字符串
如何从给定的字符串复制子字符串,该字符串具有开始索引和结束索引,或者给定了字符串的开始索引和长度。从C++ 从字符串中给定结束索引的字符串复制子字符串,c++,C++,如何从给定的字符串复制子字符串,该字符串具有开始索引和结束索引,或者给定了字符串的开始索引和长度。从std::string中,将从给定开始索引和长度的现有字符串创建新的std::string。在给定结束索引的情况下,确定必要的长度应该很简单。(如果结束索引是包含的而不是独占的,则应特别注意确保它是字符串中的有效索引。) 如果试图从C样式的字符串(以NUL结尾的char数组)创建子字符串,则可以使用构造函数。例如: const char* s = "hello world!"; size_t st
std::string
中,将从给定开始索引和长度的现有字符串创建新的std::string
。在给定结束索引的情况下,确定必要的长度应该很简单。(如果结束索引是包含的而不是独占的,则应特别注意确保它是字符串中的有效索引。)
如果试图从C样式的字符串(以NUL结尾的char
数组)创建子字符串,则可以使用构造函数。例如:
const char* s = "hello world!";
size_t start = 3;
size_t end = 6; // Assume this is an exclusive bound.
std::string substring(s + start, end - start);
与std::string::substr
不同,std::string(const char*s,size\u t n)
构造函数可以读取输入字符串的结尾,因此在这种情况下,您还应该首先验证结尾索引是否有效
std::string thesub = thestring.substr(start, length);
或
假设您想在子字符串中包含
end
th字符。您可以使用od std:string类方法。注意,这并不检查end
是否超过了C字符串的结尾。“在给定结束索引的情况下,确定必要的长度应该很简单”-仅当结束索引!=std::string::npos
在这种情况下,代码会变得非常难看。@yugr而std::string::npos-start
不会给出实际长度,std::string::substr
不会在意;允许长度超过端部。诚然,它在C-string情况下不起作用,但在这种情况下使用std::string::npos是不合适的。我主要关心的是“在给定结束索引的情况下,确定必要的长度非常简单”部分(因为由于start==0&&end==std::string::npos的溢出,确定结束索引包含时的长度并不容易。)@yugr这很公平。但请注意,想要一个包含性的结束索引并使用end==std::string::npos
一开始就没有意义。无论如何,我对我的答案做了一些轻微的调整。如果end是std::string::npos
,这将不起作用(这是问题的主要目的).@yugr我不知道你从哪里得到“问题的主要目的”from,它没有说明任何关于std::string::npos
。另外,正如我在另一条评论中所指出的,使用std::string::substr
长度太长是可以的。如果end==std::string::npos&&start==0
,这个答案确实有一个错误的极端情况,因为子字符串长度将换行为0,但是failure实际上是由于+1
(这就是为什么使用独占的结束索引几乎总是更好的原因)。1)根据我的经验,使用std::string::npos
提取字符串的尾部是非常常见的,也是使用std::substr
的主要复杂性。2) 正如您所说,建议的解决方案对于start==0&&end==std::string::npos
(即substr
返回一个完整的字符串)失败,这是一个常见的角落情况。再想一想,如果需要一个包含性的结束索引,那么end
应该是现有字符串的有效索引的先决条件,而std::string::npos
的值是无意义的,应该被禁止。
std::string thesub = thestring.substr(start, end-start+1);