Petit probléme (substr)

Résolu
Arkapiro Messages postés 7 Statut Membre -  
Arkapiro Messages postés 7 Statut Membre -
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

  1. KX Messages postés 19031 Statut Modérateur 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
    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
    2. Arkapiro Messages postés 7 Statut Membre
       
      Et tant que j'y suis, saurais-tu comment supprimer un caractère dans un string s'il te plait !
      0
    3. KX Messages postés 19031 Statut Modérateur 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
    4. 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
    5. KX Messages postés 19031 Statut Modérateur 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
  2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    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
    1. Arkapiro
       
      Le problème venait de la chaine for, qui tournait dans le vide.
      compteur < suite.size()+1
      0