将 c++ 字符串视为指针

Posted

技术标签:

【中文标题】将 c++ 字符串视为指针【英文标题】:Treat c++ string as a pointer 【发布时间】:2016-02-21 05:07:45 【问题描述】:

免责声明 -- 我来自严格的 C 背景。

如何使用 STL 和 std::string 而不是 char* 来绕过像这样(当然是荒谬的)示例的字符串?

const char* s = "XXXXXXXXhello";
while (*s == 'X') 
    s++;

s += 2;
std::cout << --(--s); //prints `hello`

【问题讨论】:

x y 问题,告诉我们你为什么要这样做 好的,更新了一点问题。告诉我这是否有帮助 听起来substr() 是更适合您的问题的解决方案。您还应该了解迭代器和函数,例如 begin()end() 【参考方案1】:

如果你想做的是修改对象,去掉“h”:

std::string s = "hello";
s = s.substr(1); // position = 1, length = everything (npos)
std::cout << s;  //"ello"

std::string s = "hello";
s.erase(0, 1); // position = 0, length = 1
std::cout << s;  //"ello"

【讨论】:

如果您要修改原始文件,s.erase(0, 1);【参考方案2】:

推荐@José 的第二个答案,不需要修改原来的str

只需std::cout&lt;&lt;s.substr(1)&lt;&lt;endl

到已编辑的问题:

std::string s = "hello world!";
cout<<s.substr(s.find_first_of('e'))<<endl; // == "ello world!"

人 std::string:

http://www.cplusplus.com/reference/string/string/?kw=string

【讨论】:

【参考方案3】:

如果你想在不修改字符串的情况下跳转,你可以使用索引或迭代器:

std::string const s("XXXXXXXXhello");

int idx = 0;
while ( s[idx] == 'X' ) 
    ++idx;

idx += 2;
std::cout << &s[idx -= 2] << '\n';

迭代器版本:

auto it = s.begin();
while (*it == 'X')
    ++it;

it += 2;
std::cout << &*it << '\n';

从 C++11 开始,保证 std::string 存储时带有空终止符,因此您可以使用 &amp; 输出字符串的尾部。在旧代码库中,您需要从 s.c_str() 进行索引。

【讨论】:

这两种方法中的任何一种是否会真正有效地“缩短”字符串,就像让变量指向字符串的新“开始”一样? @galois 他们是类似的效果,你在不修改存储的情况下查看字符串的尾部切片

以上是关于将 c++ 字符串视为指针的主要内容,如果未能解决你的问题,请参考以下文章

为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]

使用 void 指针将字符串从 C++ 传递到 C#

将 c++ dll 的 char 指针数组传递给 c# 字符串

如何将指针转换为我在 C++ 中输入的类型?

C++ 通过引用传递向量字符指针

如何在 C++ 中通过指针传递字符串?