Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] La class string

variable[i] ne marche pas toujours ?

    26 décembre 2005 à 13:30:59

    Salut à tous ! J'ai fais des recherches pour apprendre à utiliser la class string, et je connais maintenant la plupart de ses fonctions et comment les utiliser. J'ai donc codé un petit pendu (très basique, pour m'entrainner), tout marche bien, à une exception près !

    Pour récupérer un caractère d'une chaine "ch", on fait comme ceci :

    ch[position du caractère], sachant que le 1er caractère est 0 (comme dans les tableaux).

    Seulement, j'ai uen erreur bizarre en l'utilisant, dans un if... voyez plutot la portion de code qui ne fonctionne pas:

    C'est la boucle principale du jeu qui demande une lettre et vérifie si elle est dans le mot :

    do
            {

                    cout << "Entrez une lettre a deviner: " << flush;
                   
                    cin >> lettre;
                   
                    lettre = lettre.substr( 0, 1); /* On ne garde que la 1ere lettre */
                   
                    /* On parcourt le mot, et on vérifie si il n'y a pas une lettre égale */
                    for( int i = 0; i < mot.size(); i++ )
                    {

                            if( mot[i] == lettre )
                                    trouve.replace(i, 1, lettre);

                    }
                   
                    cout << trouve << endl;
                   
            } while( mot != trouve );


    Voila, tout devrait fonctionner, mais il me retourne une erreur sur la ligne du test (if):

    no match for 'operator==' in '(&mot)->std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((unsigned int)i)) == lettre'


    Je ne comprends pas bien, alors j'ai rusé pour faire le test, et ça marche :

    if( mot.substr(i, 1) == lettre )


    Mais j'aimerai tout de même comprendre d'ou viens l'erreur, car j'ai déja utilisé cette notation, et je n'avai eu aucun problème.

    Merci beaucoup !
    • Partager sur Facebook
    • Partager sur Twitter
      26 décembre 2005 à 13:44:20

      C'est normal
      lettre est de type string (je suppose)
      mot[i] est de type char donc forcément....
      ce que tu peux faire c'est à la place de substr
      c'est faire
      char c = lettre[0];

      et comparer avec c a la place de lettre :)
      • Partager sur Facebook
      • Partager sur Twitter
        26 décembre 2005 à 21:17:35

        Non non mot est de type string, et j'ai lu qu'on pouvait accèder à un caractère d'une variable de type string en faisant

        variable[num du caractère]

        alors je voulais l'utiliser. mais comme ça ne marchait pas, j'ai utilisé la fonction substr de la class string !
        • Partager sur Facebook
        • Partager sur Twitter
          26 décembre 2005 à 22:28:08

          Eh oh, ta variable string est un objet !
          Tu ne peux pas y accéder comme si c'était un tableau de char car ça n'en est pas un !

          Si tu veux faire cela, sache qu'il existe une méthode c_str() ou qqc comme ça dans la classe string qui permet d'obtenir un pointeur sur le tableau de char, pour traiter la variable comme un tableau de char en C
          • Partager sur Facebook
          • Partager sur Twitter

          If you'd like to join us, read "How do we work at OpenClassrooms"! :)

            26 décembre 2005 à 23:21:54

            Citation : http://vato.free.fr/cours/builder/tips9.htm

            Les principaux opérateurs

            Les opérateurs +, +=, ==, !=, <, <=, >, >=, >>,<< et [] peuvent être utilisés.

            string s;
            s = 'B' + "on";
            s += "jour" ;
            La chaîne s contient maintenant "Bonjour".

            char c = s[2];
            La variable c de type caractère contient 'n'.



            Il affecte à la variable c, de type char, s[2] et il dit que c'est le 3eme caractère de l'objet string, la chaine "bonjour", donc c'est le caractère "n" (normal).

            Je pensais pouvoir m'en servir dans mon test d'égalité, mais visiblement ce n'est pas possible, pourtant il utilises bien les crochets sur son objet string, alors que s est l'objet pas le pointeur pointant cers le char[] utilisé par la class.

            Il a quand même le droit de faire ça ?
            • Partager sur Facebook
            • Partager sur Twitter
              27 décembre 2005 à 0:11:17

              On a le droit d'accéder au n-ieme caractere d'une chaine via [], à condition que ce caractere existe deja (ou soit le suivant du dernier de la chaine).
              string::c_str() renvoie un pointeur sur un tableau de caracteres constants, dont la durée de vie est limitée par les opérations sur la chaine.

              Ton erreur a déja été montrée.

              string::operator[] renvoie un caractere. Tu cherche à comparer un caractere et une chaine -> erreur.
              • Partager sur Facebook
              • Partager sur Twitter
                27 décembre 2005 à 12:10:57

                Okay Mackila j'ai compris ! Pas possible de comparer un caractère et une chaine !

                Au fait, ça ne m'était pas venu à l'esprit, car j'avai mis cette ligne :

                ligne = ligne.substr(0, 1);


                Donc pour moi, ligne était un caractère, mais au fait c'était tout de même une chaîne !

                J'ai réussi à faire le test qui marche en utilisant les [] pour lettre aussi :

                if( deja[i] == lettre[0] )
                /* deja = string des caracteres qu'on a deja trouvé
                lettre = string du caractère a deviner


                Et là ça marche !

                Merci bien j'ai compris !
                • Partager sur Facebook
                • Partager sur Twitter

                [C++] La class string

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown