Comment ferais-je une boucle for sur chaque caractère d'une chaîne en C++?
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);
}
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);
}
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]);
}
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);
}
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.
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.
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;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
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);
}
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.
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;
}