web-dev-qa-db-fra.com

Pour chaque caractère de la chaîne

Comment ferais-je une boucle for sur chaque caractère d'une chaîne en C++?

203
Jack Wilsdon
  1. Boucle entre caractères d'un std::string, en utilisant une boucle for basée sur une plage (elle provient de C++ 11, déjà prise en charge dans les versions récentes de GCC, de clang et de la version bêta de VC11):

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
    
  2. Parcourant les caractères d'un std::string avec des itérateurs:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
    
  3. Parcourant les caractères d'un std::string avec une boucle for old-fashioned:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
    
  4. Boucle à travers les caractères d'un tableau de caractères à zéro terminal:

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }
    
375
R. Martinho Fernandes

Une boucle for peut être implémentée comme ceci:

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

Ceci imprimera la chaîne caractère par caractère. str[i] renvoie le caractère à l'index i.

S'il s'agit d'un tableau de caractères:

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

En gros, au-dessus de deux, il y a deux types de chaînes supportées par c ++. La seconde s'appelle c string et la première s'appelle std string ou (c ++ string). Je suggérerais d'utiliser c ++ string, beaucoup plus facile à manipuler.

27
user1065734

En C++ moderne:

std::string s("Hello world");

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

En C++ 98/03:

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

Pour une itération en lecture seule, vous pouvez utiliser std::string::const_iterator en C++ 98 et for (char const & c : s) ou seulement for (char c : s) en C++ 11.

24
Kerrek SB

Voici une autre façon de le faire, en utilisant l'algorithme standard.

#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;
   });
}
10
0xBADF00
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}
7
demoncodemonkey

Je ne vois aucun exemple utilisant une plage basée sur une boucle avec une "chaîne 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);
}

exemple non lié mais int tableau

int ia[] = {1,2,3,4,5,6};

for (int& i : ia) {
    printf("%d", i);
}
3
10SecTom
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
        }
        //...........
    }

Une chaîne est en principe un tableau de caractères, vous pouvez donc spécifier l'index pour obtenir le caractère. Si vous ne connaissez pas l'index, vous pouvez le parcourir comme le code ci-dessus, mais lorsque vous effectuez une comparaison, veillez à utiliser des guillemets simples (qui spécifient un caractère).

Autre que cela, le code ci-dessus est explicite.

1
almost a beginner

Pour C-string (char []), vous devriez faire quelque chose comme ceci:

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

Pour std::string, vous pouvez utiliser str.size() pour obtenir sa taille et l'itérer comme dans l'exemple, ou vous pouvez utiliser un itérateur:

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