【问题标题】:For every character in string对于字符串中的每个字符
【发布时间】:2012-03-15 08:14:34
【问题描述】:

如何在 C++ 中对字符串中的每个字符执行 for 循环?

【问题讨论】:

标签: c++ loops for-loop character


【解决方案1】:

您可以使用 size() 方法获取字符串的长度,并使用方括号运算符来访问每个单独的字符。

#include<bits/stdc++.h>
using namespace std;

int main()
{
   string s;
   cin >> s;
   int length = s.size();
   for(int i = 0; i < length; i++)
   {
      process(s[i]);
   }
}

【讨论】:

    【解决方案2】:
    1. 使用基于范围的 for 循环遍历 std::stringcharacters(它来自 C++11,已在 GCC、clang 和 VC11 beta 的最新版本中得到支持):

      std::string str = ???;
      for(char& c : str) {
          do_things_with(c);
      }
      
    2. 使用迭代器遍历std::string 的字符:

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

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

      char* str = ???;
      for(char* it = str; *it; ++it) {
          do_things_with(*it);
      }
      

    【讨论】:

    • 这确实让我有些困惑,因为 std::string 是 UTF8(假设是),所以编码可能是可变长度的。你是遍历字符串中的字节还是这里的字符?
    • @Robinson:这是一个错误的假设。一个非常错误的假设。另外,“字符”有很多不同的含义,最好避免使用这个词。
    • 嗯,好吧,它没有编码,但是考虑到 utf8 现在无处不在(尤其是在网络上),并且人们可能希望在整个管道或应用程序中使用单一一致的编码作为基础在这个讨论中,我的 std::strings 都是 utf8 :p.
    • @Robinson:我的所有内容都被视为无编码,因为我不是在面向用户的域中编程(也就是说,没有注定要呈现给人类的字符串)。如果要谈字符编码,则需要谈std::string之上的更高层次的抽象,这只是一系列字节。
    • 另外,案例 2 和 3 是您可以/应该使用“auto”的好例子
    【解决方案3】:

    你可以通过使用字符串库的at函数来获取字符串中的每个字符,就像我这样做的那样

    string words;
        for (unsigned int i = 0; i < words.length(); i++)
            {
                if (words.at(i) == ' ')
                {
                    spacecounter++;    // to count all the spaces in a string
                    if (words.at(i + 1) == ' ')
                    {
                        i += 1;
                    }
    

    这只是我的一段代码,但重点是你可以通过stringname.at(index)访问字符

    【讨论】:

      【解决方案4】:

      我没有看到任何使用基于范围的 for 循环和“c 字符串”的示例。

      char cs[] = "This is a c string\u0031 \x32 3";
      
      // range based for loop does not print '\n'
      for (char& c : cs) {
          printf("%c", c);
      }
      

      不相关但 int 数组示例

      int ia[] = {1,2,3,4,5,6};
      
      for (int& i : ia) {
          printf("%d", i);
      }
      

      【讨论】:

        【解决方案5】:

        这是另一种方法,使用标准算法。

        #include <iostream>
        #include <string>
        #include <algorithm>
        
        int main()
        {
           std::string name = "some string";
           std::for_each(name.begin(), name.end(), [] (char c) {
              std::cout << c;
           });
        }
        

        【讨论】:

        【解决方案6】:
        for (int x = 0; x < yourString.size();x++){
                if (yourString[x] == 'a'){
                    //Do Something
                }
                if (yourString[x] == 'b'){
                    //Do Something
                }
                if (yourString[x] == 'c'){
                    //Do Something
                }
                //...........
            }
        

        字符串基本上是一个字符数组,因此您可以指定索引来获取字符。如果您不知道索引,那么您可以像上面的代码一样循环遍历它,但是当您进行比较时,请确保使用单引号(它指定一个字符)。

        除此之外,上面的代码是不言自明的。

        【讨论】:

          【解决方案7】:

          for 循环可以这样实现:

          string str("HELLO");
          for (int i = 0; i < str.size(); i++){
              cout << str[i];
          }
          

          这将逐个字符地打印字符串。 str[i] 返回索引 i 处的字符。

          如果是字符数组:

          char str[6] = "hello";
          for (int i = 0; str[i] != '\0'; i++){
              cout << str[i];
          }
          

          基本上以上两种是c++支持的两种字符串。 第二个叫c字符串,第一个叫std string or(c++ string)。我建议使用c++ string,很容易处理。

          【讨论】:

            【解决方案8】:
            const char* str = "abcde";
            int len = strlen(str);
            for (int i = 0; i < len; i++)
            {
                char chr = str[i];
                //do something....
            }
            

            【讨论】:

            • (过时的注释,可能仍然与 OP 相关:)在循环条件中使用 strlen 被认为不是一种好的形式,因为它需要对字符串进行 O(n) 操作对于每次迭代,使整个循环 O(n^2) 的字符串大小。循环条件中的strlen 可以在循环期间字符串发生变化时调用,但应保留用于实际需要的情况。
            • @MagnusHoff:是的,Schlemiel the Painter 又抬起了丑陋的脑袋。
            • 我已经编辑了我的答案。 Magnus,你是对的,哎呀,过去几年里一直在 c# 中使用 foreach ;)
            • 但是,您仍应在循环外使用 strlen(),而不是在每次迭代中测试 null。
            【解决方案9】:

            对于 C 字符串 (char []),您应该这样做:

            char mystring[] = "My String";
            int size = strlen(mystring);
            int i;
            for(i = 0; i < size; i++) {
                char c = mystring[i];
            }
            

            对于std::string,您可以使用str.size() 来获取其大小并像示例一样进行迭代,或者可以使用迭代器:

            std::string mystring = "My String";
            std::string::iterator it;
            for(it = mystring.begin(); it != mystring.end(); it++) {
                char c = *it;
            }
            

            【讨论】:

              【解决方案10】:

              在现代 C++ 中:

              std::string s("Hello world");
              
              for (char & c : s)
              {
                  std::cout << "One character: " << c << "\n";
                  c = '*';
              }
              

              在 C++98/03 中:

              for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
              {
                  std::cout << "One character: " << *it << "\n";
                  *it = '*';
              }
              

              对于只读迭代,您可以在 C++98 中使用 std::string::const_iterator,在 C++11 中使用 for (char const &amp; c : s) 或仅使用 for (char c : s)

              【讨论】:

              • 以下是一些支持部分 C++11 的编译器的选项:pastebin.com/LBULsn76
              • @BenjaminLindley:谢谢! auto 总是一个好主意。使用它时,begin()cbegin() 之间的区别变得相关。
              • 这里 char 中的引用有什么作用(char &amp; c)?是否只是允许在需要的情况下修改字符值?
              猜你喜欢
              • 2011-09-21
              • 1970-01-01
              • 2015-12-14
              • 1970-01-01
              • 1970-01-01
              • 2017-06-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多