Faire une boucle à travers les caractères de a std::string, en utilisant une boucle for basée sur une plage (c'est de C ++ 11, déjà pris en charge dans les versions récentes de GCC, clang et VC11 beta):
std::string str =???;for(char& c : str){
do_things_with(c);}
Parcourant les caractères d'un std::stringavec des itérateurs:
std::string str =???;for(std::string::iterator it = str.begin(); it != str.end();++it){
do_things_with(*it);}
En boucle à travers les personnages d'un std::stringavec une boucle for-old-fashioned:
std::string str =???;for(std::string::size_type i =0; i < str.size();++i){
do_things_with(str[i]);}
Boucle à travers les caractères d'un tableau de caractères à terminaison nulle:
char* str =???;for(char* it = str;*it;++it){
do_things_with(*it);}
@Robinson: C'est une hypothèse erronée. Une hypothèse très erronée. En outre, "caractère" a tellement de significations différentes, il est préférable d'éviter strictement le terme.
Puppy
6
@Robinson: "std :: string est UTF8 (supposé être) " Depuis quand?!
Courses de légèreté en orbite le
2
Eh bien, OK, il n'a pas d'encodage, cependant étant donné l'ubiquité d'utf8 maintenant (en particulier sur le Web) et le fait que l'on puisse vouloir un seul encodage cohérent dans un pipeline ou une application, pour la base de cette discussion, mon std :: strings sont tous utf8: p.
Robinson
4
@Robinson: Et toutes les miennes sont traitées sans encodage car je ne programme pas dans un domaine accessible aux utilisateurs (c'est-à-dire qu'il n'y a pas de chaînes destinées à être rendues aux humains). Si vous voulez parler des encodages de caractères, vous devez parler d'une abstraction de niveau supérieurstd::string , qui n'est qu'une série d'octets.
Courses de légèreté en orbite le
1
aussi, les cas 2 et 3 sont un bon exemple où vous pouvez / devez utiliser "auto"
galois
29
Une boucle for peut être implémentée comme ceci:
string str("HELLO");for(int i =0; i < str.size(); i++){
cout << str[i];}
Cela 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];}
Fondamentalement, au-dessus de deux, deux types de chaînes sont pris en charge par c ++. La seconde est appelée chaîne c et la première est appelée chaîne std ou (chaîne c ++). Je suggérerais d'utiliser une chaîne c ++, beaucoup plus facile à gérer.
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 l'itération en lecture seule, vous pouvez utiliser std::string::const_iteratoren C ++ 98 et for (char const & c : s)ou simplement for (char c : s)en C ++ 11.
Voici quelques options pour les compilateurs avec prise en charge partielle de C ++ 11: pastebin.com/LBULsn76
Benjamin Lindley
@BenjaminLindley: Merci! autoest toujours une bonne idée. Lors de son utilisation, la distinction entre begin()et cbegin()devient pertinente.
Kerrek SB
2
quel est le rôle de la référence dans char ici ( char & c)? Est-ce juste pour permettre la modification de la valeur du caractère dans le cas où cela serait nécessaire?
LunaticSoul
11
Voici une autre façon de le faire, en utilisant l'algorithme standard.
(Commentaire obsolète, qui est probablement toujours pertinent pour l'OP :) Il n'est pas considéré comme une bonne forme à utiliser strlendans la condition de boucle, car il nécessite une opération O (n) sur la chaîne pour chaque itération, ce qui rend la boucle entière O (n ^ 2) dans la taille de la chaîne. strlendans la boucle peut être appelée si la chaîne change pendant la boucle, mais doit être réservée aux cas où elle est réellement requise .
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 essentiellement 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 faites une comparaison, assurez-vous d'utiliser des guillemets simples (qui spécifient un caractère).
En dehors de cela, le code ci-dessus est explicite.
vous pouvez obtenir tous les caractères d'une chaîne en utilisant la fonction at de la bibliothèque de chaînes, comme je l'ai fait comme ça
string words;for(unsignedint i =0; i < words.length(); i++){if(words.at(i)==' '){
spacecounter++;// to count all the spaces in a stringif(words.at(i +1)==' '){
i +=1;}
ce n'est qu'un segment de mon code, mais le fait est que vous pouvez accéder aux caractères par stringname.at(index)
std::string
?char
, Point de code Unicode, grappe de graphèmes étendue?index
partie des réponses.Réponses:
Faire une boucle à travers les caractères de a
std::string
, en utilisant une boucle for basée sur une plage (c'est de C ++ 11, déjà pris en charge dans les versions récentes de GCC, clang et VC11 beta):Parcourant les caractères d'un
std::string
avec des itérateurs:En boucle à travers les personnages d'un
std::string
avec une boucle for-old-fashioned:Boucle à travers les caractères d'un tableau de caractères à terminaison nulle:
la source
std::string
, qui n'est qu'une série d'octets.Une boucle for peut être implémentée comme ceci:
Cela imprimera la chaîne caractère par caractère.
str[i]
renvoie le caractère à l'indexi
.S'il s'agit d'un tableau de caractères:
Fondamentalement, au-dessus de deux, deux types de chaînes sont pris en charge par c ++. La seconde est appelée chaîne c et la première est appelée chaîne std ou (chaîne c ++). Je suggérerais d'utiliser une chaîne c ++, beaucoup plus facile à gérer.
la source
En C ++ moderne:
En C ++ 98/03:
Pour l'itération en lecture seule, vous pouvez utiliser
std::string::const_iterator
en C ++ 98 etfor (char const & c : s)
ou simplementfor (char c : s)
en C ++ 11.la source
auto
est toujours une bonne idée. Lors de son utilisation, la distinction entrebegin()
etcbegin()
devient pertinente.char & c
)? Est-ce juste pour permettre la modification de la valeur du caractère dans le cas où cela serait nécessaire?Voici une autre façon de le faire, en utilisant l'algorithme standard.
la source
la source
strlen
dans la condition de boucle, car il nécessite une opération O (n) sur la chaîne pour chaque itération, ce qui rend la boucle entière O (n ^ 2) dans la taille de la chaîne.strlen
dans la boucle peut être appelée si la chaîne change pendant la boucle, mais doit être réservée aux cas où elle est réellement requise .Je ne vois aucun exemple utilisant une plage basée sur une boucle avec une "chaîne c".
exemple non lié mais int array
la source
Pour C-string (
char []
), vous devriez faire quelque chose comme ceci:Car
std::string
vous pouvez utiliserstr.size()
pour obtenir sa taille et itérer comme l'exemple, ou vous pouvez utiliser un itérateur:la source
Une chaîne est essentiellement 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 faites une comparaison, assurez-vous d'utiliser des guillemets simples (qui spécifient un caractère).
En dehors de cela, le code ci-dessus est explicite.
la source
vous pouvez obtenir tous les caractères d'une chaîne en utilisant la fonction at de la bibliothèque de chaînes, comme je l'ai fait comme ça
ce n'est qu'un segment de mon code, mais le fait est que vous pouvez accéder aux caractères par
stringname.at(index)
la source