我有一个字符串,我需要抓取每个字符并进行一些检查:
std::string key = "test"
int i = 0;
while (key.at(i))
{
// do some checking
i++;
}
这里的问题是,最终索引
i
将超出范围,因此系统将崩溃。我该如何解决这个问题?
std::string key = "test"
for(int i = 0; i < key.length(); i++)
{
//do some checking
}
for(auto i = key.cbegin(); i != key.cend(); ++i)
{
// do some checking
// call *i to get a char
}
你可以像这样使用for循环。
#include <string>
std::string str("hello");
for(auto &c : str) {
std::cout << c << std::endl;
}
另一种解决方案是使用
std::for_each()
并提供一个 lambda 函数来处理每个字符,如下所示:
std::string key = "testing 123";
std::for_each(key.cbegin(), key.cend(), [](char c){ std::cout << c; });
打印:
testing 123
你可以这样做,考虑一个
string
变量。只是迭代字符:
cout << "Insert a phrase, please: ";
getline(cin, input);
for (char c: input) {
cout << "Character: " << c << endl;
}
就用户输入而言,
cin >> variable
和getline(cin, variable)
之间存在差异:
cin
如果遇到空格则停止读取字符getline(cin, variable)
从输入中读取,直到遇到 EOL 字符欲了解更多信息
getline()
:
#include <iostream>
using namespace std;
string userInputCin() {
string input;
cout << "Insert a phrase, please: ";
cin >> input;
for (char c: input) {
cout << "Character: " << c << endl;
}
return input;
}
string userInputCinGetline() {
string input;
cout << "Insert a phrase, please: ";
getline(cin, input);
for (char c: input) {
cout << "Character: " << c << endl;
}
return input;
}
int main()
{
int option;
cout << "[Processing String Input]" << endl;
cout << "\n1. with cin" << endl;
cout << "2. with cin + getline" << "\n\n> ";
cin >> option;
switch (option) {
case 1:
userInputCin();
break;
case 2:
cin.ignore(); // make sure to call this, if calling getline() after
userInputCinGetline();
break;
}
return 0;
}
迭代 std::string 的字符的最简单方法如下:
std::string key = "test"
for (char &ch : key) {
printf("%c\n", ch);
}