c++ - 显示从索引 i 到字符串末尾的 std::string

标签 c++ string char

例如:

char s[]="abcde";
    for(int i=0;i<strlen(s);i++)
          cout<<s+i<<endl;

输出:

abcde
bcde
cde
de
e

这不会破坏 char 数组。

我想寻求帮助的是,有没有其他方法可以用 std::string 类做到这一点?

最佳答案

廉价而讨厌的方式,最接近您已有的方式:使用 std::string::c_str()

std::string const s{"abcde"};
char const *c = s.c_str();
for (std::size_t i=0; i<s.size(); ++i)
    std::cout << c+i << '\n';

更像 string 的方法是使用 std::string::substr :

std::string const s{"abcde"};
for (std::size_t i=0; i<s.size(); ++i)
    std::cout << s.substr(i) << '\n';

请注意,第二种方法确实涉及每次都为新的 string 分配内存,但我认为这里的好处是清晰(使用专门为您尝试做的事情命名和设计的函数) ,并避免原始指针(通常是初学者混淆的原因)都超过了这里的性能(非)问题。


一种更现代的方法是使用 std::experimental::string_view,它结合了使用为你想要的东西而设计的特定 C++ 组件的清晰度,同时避免了额外的分配。 ,旨在包装现有的字符串:

std::string const s{"abcde"};
std::experimental::string_view sv{s};
for (std::size_t i=0; i<s.size(); ++i) {
    std::cout << sv << '\n';
    sv.remove_prefix(1);
}

std::experimental::string_view::remove_prefix做你可能期望的事情:按指定的数字缩小它在前面包装的字符串的 View 。

string_view 在技术上还不是标准的一部分,所以我真的不推荐将它用于生产,因为你不会得到良好的跨平台支持。但是学习起来很有趣。您可能会考虑非常相似(并非巧合)的组件 boost::string_ref成为生产质量。


此外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;endl (这些是解释的链接)。

关于c++ - 显示从索引 i 到字符串末尾的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888035/

相关文章:

c++ - 编译器优化掉的内存分配

javascript - 将文本与数组项连接时覆盖文本

java - 如何引用另一个类中的字符串?

c++ - 如何读取 infile 中的指令,然后使用 infile 中的参数将函数形状写入 outfile

c++ - 设置未知长度整数类型的高位

c++ - LLVM 在 std::vector 中存储 Loop*

c - 函数有效但也返回 null - C

c - C 中的指针和字符变量

c - 第一个 scanf ("%s") 在使用第二个 scanf ("%s") 时中断,读取 0

c++ - 从文件 c++ 中读取包括空格和排除换行符的字符