Petit probléme (substr)
Résolu/Fermé
Arkapiro
Messages postés
6
Date d'inscription
lundi 7 avril 2014
Statut
Membre
Dernière intervention
18 juillet 2015
-
16 juil. 2015 à 21:23
Arkapiro Messages postés 6 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 18 juillet 2015 - 17 juil. 2015 à 22:01
Arkapiro Messages postés 6 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 18 juillet 2015 - 17 juil. 2015 à 22:01
2 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
16 juil. 2015 à 21:47
16 juil. 2015 à 21:47
Bonjour,
il vaudrait mieux écrire
C'est dommage de calculer à chaque fois la somme +1 alors que suite.size() conserve toujours la même valeur, il vaudrait mieux avoir
De plus je doute que ce soit réellement
Ici tu fais un substring de taille 1, tu récupères donc 1 seul caractère, il aurait donc été plus judicieux de faire un
Dans le dernier cas de la boucle (avec compteur==suite.size()) tu essayes de récupérer le caractère à la position
Tu dois arrêter ta boucle plus tôt sinon tu vas déborder.
Pour résumer :
Remarque : on peut encore faire un petit peu mieux, car compteur+1 calcules l'entier suivant, ce que fait aussi compteur++. aire deux fois le même calcul c'est une de trop.
NB. Je n'ai pas vérifié ces codes.
-
int compteur(0);
il vaudrait mieux écrire
int compteur=0;car la notation
compteur(0)est associée de la notion d'objet et de constructeur alors que
intest un type primitif.
-
compteur < suite.size()+1
C'est dommage de calculer à chaque fois la somme +1 alors que suite.size() conserve toujours la même valeur, il vaudrait mieux avoir
compteur < navec
int n = suite.size()+1calculé une seule fois.
De plus je doute que ce soit réellement
+1à mon avis ce sera
-1, j'y reviendrais.
-
suite.substr(compteur, 1)
Ici tu fais un substring de taille 1, tu récupères donc 1 seul caractère, il aurait donc été plus judicieux de faire un
suite[compteur]pour avoir directement le caractère voulu.
-
suite.substr(compteur + 1, 1)
Dans le dernier cas de la boucle (avec compteur==suite.size()) tu essayes de récupérer le caractère à la position
suite.size()+1alors que les caractères vont de 0 à
suite.size()-1...
Tu dois arrêter ta boucle plus tôt sinon tu vas déborder.
- Les accolades sont facultatives lorsqu'il n'y a qu'une seule instruction.
Pour résumer :
for (int compteur=0, limite=suite.size()-1; compteur<limite; compteur++)
if (suite[compteur] != suite[compteur+1])
verification++;
Remarque : on peut encore faire un petit peu mieux, car compteur+1 calcules l'entier suivant, ce que fait aussi compteur++. aire deux fois le même calcul c'est une de trop.
for (int compteur=0, limite=suite.size()-1; compteur < limite; )
if (suite[compteur] != suite[++compteur])
verification++;
NB. Je n'ai pas vérifié ces codes.
NHenry
Messages postés
15047
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 mars 2023
331
16 juil. 2015 à 21:49
16 juil. 2015 à 21:49
Quel est ton problème ?
Travailles-tu bien en C++ ? (je ne vois pas de libération de la chaine obtenue pas substr et il faut utiliser une fonction pour tester l'égalité entre 2 chaines, sinon, ça test les pointeurs)
Travailles-tu bien en C++ ? (je ne vois pas de libération de la chaine obtenue pas substr et il faut utiliser une fonction pour tester l'égalité entre 2 chaines, sinon, ça test les pointeurs)
16 juil. 2015 à 23:09
Le problème venait de la chaine for :
Dans cette partie de code :
je ne comprends néanmoins (même si cela fonctionne) comment fonctionne la première ligne :
Et Je me demandais pourquoi on doit écrire : suite[++compteur] et pas : suite[compteur++]
Merci encore pour votre aide !
16 juil. 2015 à 23:38
17 juil. 2015 à 08:26
La boucle for fonctionne de cette manière :
Ici, instruction d'initialisation :
condition de continuation :
instruction d'incrément : aucune
À cause de l'ordre qu'il y a entre les deux opérations de retour de la valeur courante et de l'incrément de la valeur, qui est différente entre ces deux écritures.
Tu peux le faire avec replace (en remplaçant le caractère que tu veux par une chaîne vide)
http://www.cplusplus.com/reference/string/string/replace/
Ou alors avec deux substr (avant et après le caractère) que tu concatènes.
http://www.cplusplus.com/reference/string/string/substr/
17 juil. 2015 à 13:27
Juste un dernier point, dans la boucle for l'incrémentation est automatique si le champ est vide ? (comme dans ton exemple :
)
17 juil. 2015 à 18:53