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);