基本上我想发现一种情况:用户输入一个字符串让我们说“sarah”,如果有人想对名字 sarah 中的每个字符进行操作,它现在存储在字符串数据类型中,怎么做?就像首先从字符串中获取 s 然后是 a 然后 r 等等。任何内置功能或更好的策略?谢谢。
问问题
236 次
3 回答
4
一种使用 : 和 lambda 函数的简单方法std::for_each
(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];
}
或使用 C++11:-
for(char& x : str) {
//Play with x;
}
于 2013-10-24T18:34:35.097 回答
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;
}
于 2013-10-24T18:39:33.930 回答
1
你可以使用这个:
使用基于范围的 for 循环遍历a 的字符
std::string
(它来自 C++11,在最近的 GCC、clang 和 VC11 beta 版本中已经支持):std::string str = "sarah"; for(char& c : str) { do_things_with(c); }
std::string
用迭代器循环 a 的字符:std::string str = "sarah"; for(std::string::iterator it = str.begin(); it != str.end(); ++it) { do_things_with(*it); }
std::string
用老式的 for循环遍历 a 的字符: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); }
请参阅:对于字符串中的每个字符
于 2013-10-24T18:35:08.533 回答