对于字符串中的每个字符


229

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


9
什么样的弦?C弦或std::string
Mysticial

它是从文本文件中读取的,因此我假设std ::
Jack Wilsdon

4
什么样的性格?char,Unicode代码点,扩展字素簇?
菲利普

可能如何遍历字符串并知道索引(当前位置)的可能重复项。不用担心index答案中的内容。
jww 2014年

Answers:


417
  1. 通过循环字符std::string,使用范围为基础的环路(它是从C ++ 11,近GCC,铛的版本已经支撑,并且VC11测试版):

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

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

    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);
    }

4
@罗宾逊:这是一个错误的假设。一个非常错误的假设。另外,“字符”有许多不同的含义,最好严格避免使用该术语。
小狗2014年

6
@Robinson:“ std :: string是UTF8(假定为)
Lightness Races in Orbit

2
好吧,好的,它没有编码,但是考虑到utf8现在无处不在(尤其是在网络上),并且出于讨论的目的,我可能希望在整个管道或应用程序中使用一种一致的编码,这是我的std :: strings都是utf8:p。
罗宾逊2014年

4
@Robinson:我的所有代码都被视为无编码的,因为我不是在面向用户的域中编程的(也就是说,没有字符串要呈现给人类)。如果要讨论字符编码,则需要在之上 讨论一个更高级别的抽象std::string,该抽象只是一系列字节。
Lightness Races in Orbit

1
同样,案例2和案例3是您可以/应该使用“自动”的好例子
galois

29

for循环可以这样实现:

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

这将逐字符打印字符串。 str[i]返回index处的字符i

如果是字符数组:

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

基本上以上两种是c ++支持的两种类型的字符串。第二个称为c字符串,第一个称为std字符串或(c ++字符串)。我建议使用c ++字符串,非常容易处理。


24

在现代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 = '*';
}

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


对于部分支持C ++ 11的编译器,这里有几个选项:pastebin.com/LBULsn76
Benjamin Lindley,

@BenjaminLindley:谢谢!auto总是一个好主意。当使用它,之间的区别begin(),并cbegin()成为相关。
Kerrek SB 2012年

2
char(char & c)中引用的作用是什么?是否只是在需要的情况下允许修改字符值?
LunaticSoul

11

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

#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;
   });
}

我们有2018年,所以这应该是正确的答案。
rwst

7
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}

4
(过时的注释,仍然可能与OP有关:)strlen在循环条件下使用它不是一种好方法,因为每次迭代都需要对字符串进行O(n)操作,从而使整个循环为O(n ^ 2)的大小。strlen如果字符串在循环过程中发生更改,则可以在循环条件中调用in,但应保留该字符串以用于实际需要的情况
Magnus Hoff 2012年

@MagnusHoff:是的,画家Schlemiel再次抬起丑陋的头。
弗雷德·拉森

我已经编辑了答案。Magnus,您是对的,最近几年在C#中一直在使用foreach;)
demoncodemonkey 2012年

但是,您仍然应该在循环外使用strlen(),而不是在每次迭代中测试null。
mckenzm

4

我看不到任何示例使用基于范围的“ 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);
}

1

对于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;
}

1
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
        }
        //...........
    }

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

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


-1

您可以通过使用字符串库的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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.