Petit probléme (substr)

Résolu
Arkapiro Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
Arkapiro Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai commencé à apprendre le C++ il y a peu de temps. En essayant de résoudre un problème informatique je suis tombé sur une impasse. Je ne comprend pas d'où viens le problème. C'est pour cela que vous demande votre aide !

Voici la partie du code qui pose un problème :
 for(int compteur(0); compteur < suite.size()+1; compteur++)
{
if(suite.substr(compteur, 1) != (suite.substr(compteur + 1, 1)))
{
verification ++;
}
}


De plus, je serais heureux d'entendre tout conseil (Si vous en avez) pour améliorez mon style de code !

Merci d'avance !

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,
 
  • 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
int
est 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 < n
avec
int n = suite.size()+1
calculé 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()+1
alors 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.
1
Arkapiro
 
Merci pour cette réponse enrichissante !
Le problème venait de la chaine for :
compteur < suite.size()+1


Dans cette partie de code :
for (int compteur=0, limite=suite.size()-1; compteur < limite; )
if (suite[compteur] != suite[++compteur])
verification++;
je ne comprends néanmoins (même si cela fonctionne) comment fonctionne la première ligne :
for (int compteur=0, limite=suite.size()-1; compteur < limite; )

Et Je me demandais pourquoi on doit écrire : suite[++compteur] et pas : suite[compteur++]

Merci encore pour votre aide !
0
Arkapiro Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Et tant que j'y suis, saurais-tu comment supprimer un caractère dans un string s'il te plait !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
  • je ne comprends néanmoins (même si cela fonctionne) comment fonctionne la première ligne
    for (int compteur=0, limite=suite.size()-1; compteur < limite; )

La boucle for fonctionne de cette manière :

for (instruction_d_initialisation ; condition_de_continuation ; instruction_d_increment)

Ici, instruction d'initialisation :
int compteur=0, limite=suite.size()-1

condition de continuation :
compteur < limite

instruction d'incrément : aucune
 
  • pourquoi on doit écrire : suite[++compteur] et pas : suite[compteur++]

À 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.

int a = 0, b = a++; // a=1, b=0
int a = 0, b = ++a; // a=1, b=1

 
  • "comment supprimer un caractère dans un string"

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/
0
Arkapiro
 
Ok trés bien je comprend mieux.

Juste un dernier point, dans la boucle for l'incrémentation est automatique si le champ est vide ? (comme dans ton exemple :
for (int compteur=0, limite=suite.size()-1; compteur < limite; )
)
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Non, l'incrément n'est pas automatique, mais il est déjà fait avec
suite[++compteur]
c'est tout l'intérêt de ce code, c'est de ne faire l'incrément qu'une seule fois.
0
NHenry Messages postés 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
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)

0
Arkapiro
 
Le problème venait de la chaine for, qui tournait dans le vide.
compteur < suite.size()+1
0