将 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<<s.substr(1)<<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
存储时带有空终止符,因此您可以使用 &
输出字符串的尾部。在旧代码库中,您需要从 s.c_str()
进行索引。
【讨论】:
这两种方法中的任何一种是否会真正有效地“缩短”字符串,就像让变量指向字符串的新“开始”一样? @galois 他们是类似的效果,你在不修改存储的情况下查看字符串的尾部切片以上是关于将 c++ 字符串视为指针的主要内容,如果未能解决你的问题,请参考以下文章
为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]