我希望能够遍历C ++字符串中的每个字符。最简单的方法是什么?首先将其转换为C字符串?我实际上无法以任何方式使它工作,但这是我到目前为止所尝试的:
string word = "Foobar";
for (int i=0; i<word.length(); ++i) {
cout << word.data()[i] << endl;
}
答案 0 :(得分:5)
您可以直接在字符串上使用operator[]
。它超载了。
string word = "Foobar";
for (size_t i=0; i<word.length(); ++i) {
cout << word[i] << endl;
}
答案 1 :(得分:5)
你应该使用Iterator。此方法适用于大多数STL的容器。
#include <iostream>
#include <string>
int main()
{
std::string str("Hello world !");
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
std::cout << *it << std::endl;
}
答案 2 :(得分:2)
std::string
公开随机访问迭代器,因此您可以使用它们来迭代字符串中的每个字符。
答案 3 :(得分:2)
迭代整个字符串的最简单方法是使用基于循环的C ++ 11范围:
for (auto c : word)
{
std::cout << c << std::endl;
}
否则,你可以通过operator[]
访问单个元素,就像使用数组一样,或者使用迭代器:
for (std::string::size_type i = 0, size = word.size(); i < size; ++i)
{
std::cout << word[i] << std::endl;
}
for (auto i = word.cbegin(), end = word.cend(); i != end; ++i)
{
std::cout << *i << std::endl;
}
答案 4 :(得分:2)
你应该有什么工作(合理的短弦);虽然你可以访问每个角色word[i]
而不用乱搞指针。
迂腐地说,您应该使用string::size_type
或size_t
而不是int
。
您可以使用迭代器:
for (auto it = word.begin(); it = word.end(); ++it) {
cout << *it << endl;
}
(在C ++ 11之前,您必须提供类型名称string::iterator
或string::const_iterator
而不是auto
。)
在C ++ 11中,您可以遍历范围:
for (char ch : word) {
cout << ch << endl;
}
或者您可以将for_each
与lambda:
for_each(word.begin(), word.end(), [](char ch){cout << ch << endl;});
答案 5 :(得分:0)
其他人已经指出,最简单的方法是使用[]运算符,在字符串类中重载。
string word = "Foobar";
for (int i=0; i<word.length(); ++i) {
cout << word[ i ] << endl;
}
如果您已经知道如何迭代C字符串,那么有一种机制,类似于C中的指针,您可以使用它,并且性能会更高。
string word =“Foobar”;
for(string :: const_iterator it = word.begin(); it!= word.end(); ++ it)
{
cout&lt;&lt; *它&lt;&lt; ENDL;
}
你有const迭代器和常规迭代器。当您计划更改它们指向的数据时,将使用后者进行迭代。前者适用于只读操作,例如控制台转储。
string word = "Foobar";
for (string::iterator it = word.begin(); it != word.end(); ++it)
{
(*it)++;
}
使用上面的代码,您将使用下一个字符“加密”您的单词。
最后,你总是有可能回到C指针:
string word = "Foobar";
const char * ptr = word.c_str();
for (; *ptr != 0; ++ptr)
{
(*ptr)++;
}
希望这有帮助。