c ++中有多少方法逐个字符地读取字符串以对每个字符执行所需的操作?

时间:2013-10-24 18:30:36

标签: c++ arrays string

基本上我想发现一个 情况: 用户输入一个字符串,让我们说“sarah”,如果有人想对名字sarah中的每个字符进行操作,它现在存储在字符串数据类型中,怎么办呢?比如首先从字符串中获取s然后再获取r,依此类推。任何内置功能或更好的策略? 感谢。

3 个答案:

答案 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)

你可以用这个:

  1. 循环使用std::string的字符,使用基于范围的for循环(它来自C ++ 11,最近发布的GCC,clang和VC11 beta版已经支持):< / p>

    std::string str = "sarah";
    for(char& c : str) {
        do_things_with(c);
    }
    
  2. 循环使用迭代器std::string的字符:

    std::string str = "sarah";
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
    
  3. 使用旧式for循环遍历std::string的字符:

    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
    
  4. 循环使用以null结尾的字符数组的字符:

    char* str = "sarah";
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }
    
  5. 请参阅:For every character in string

答案 2 :(得分:1)

这是另一个:

std::transform(begin(str), end(str), begin(str), do_things);

其中do_things是一个字符操作。我更喜欢transformfor_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;
}