基本上我想发现一个 情况: 用户输入一个字符串,让我们说“sarah”,如果有人想对名字sarah中的每个字符进行操作,它现在存储在字符串数据类型中,怎么办呢?比如首先从字符串中获取s然后再获取r,依此类推。任何内置功能或更好的策略? 感谢。
答案 0 :(得分:4)
使用的一个简单方法:std::for_each
和lambda函数(C ++ 11)
std::string str="sarah";
std::for_each( str.begin(), str.end(),
[](char &x){
//Play with x
}
);
否则,只需使用for循环
for(size_t i=0;i<str.size();++i)
{
//Play with str[i];
}
OR与C ++ 11: -
for(char& x : str) {
//Play with x;
}
答案 1 :(得分:1)
你可以用这个:
循环使用std::string
的字符,使用基于范围的for循环(它来自C ++ 11,最近发布的GCC,clang和VC11 beta版已经支持):< / p>
std::string str = "sarah";
for(char& c : str) {
do_things_with(c);
}
循环使用迭代器std::string
的字符:
std::string str = "sarah";
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
使用旧式for循环遍历std::string
的字符:
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
循环使用以null结尾的字符数组的字符:
char* str = "sarah";
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
答案 2 :(得分:1)
这是另一个:
std::transform(begin(str), end(str), begin(str), do_things);
其中do_things
是一个字符操作。我更喜欢transform
到for_each
,因为对我而言,它更好地表达了正在发生的转变。但是,如果do_things
改为引用字符,那么for_each
(或循环)可能是更好的选择。
这是一个更加充实的例子:
#include <iostream>
#include <string>
#include <algorithm> // for std::transform
#include <cctype> // for toupper/tolower
// Needed because toupper/tolower take and return ints, not chars.
char upper(char c) { return std::toupper(c); }
char lower(char c) { return std::tolower(c); }
int main() {
using namespace std;
string name;
cout << "Enter your name: ";
cin >> name;
// Make the name uppercase.
transform(name.begin(), name.end(), name.begin(), upper);
cout << "HI " << name << endl;
// Make the name lowercase.
transform(name.begin(), name.end(), name.begin(), lower);
cout << "hi " << name << endl;
}