Comment pourrais-je faire une boucle for sur chaque caractère d'une chaîne en C ++?
char
, Point de code Unicode, grappe de graphèmes étendue?
index
partie des réponses.
Comment pourrais-je faire une boucle for sur chaque caractère d'une chaîne en C ++?
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):
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);
}
En boucle à travers les personnages 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 à terminaison nulle:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
, qui n'est qu'une série d'octets.
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.
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 l'itération en lecture seule, vous pouvez utiliser std::string::const_iterator
en C ++ 98 et for (char const & c : s)
ou simplement for (char c : s)
en C ++ 11.
auto
est toujours une bonne idée. Lors de son utilisation, la distinction entre begin()
et cbegin()
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.
#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....
}
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".
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 array
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
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];
}
Car std::string
vous pouvez utiliser str.size()
pour obtenir sa taille et itérer comme 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;
}
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 (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;
}
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
?