Partage
  • Partager sur Facebook
  • Partager sur Twitter

Echappement double-quote déteriore l'output

Sujet résolu
    10 juin 2019 à 9:28:50

    Bonjour,

    Débutant en C++, j’apprends avec le tuto "Programmez avec le langage C++".
    J'en suis à l'étape du TP "Mot mystère".

    J'ai réussi à développer toutes les fonctionnalités du jeu mais j'ai un souci avec l'étape additionnelle du "dictionnaire".

    J'importe le fichier "dico.txt", celui-ci est bien chargé par mon script.
    Je fais une boucle qui va parcourir le fichier et sélectionner le mot en fonction d'un numéro de ligne aléatoire.

    Le mot est bien sélectionné, mais je voudrais l'afficher entre guillets dans une sortie console, je suis donc obligé d'échapper les guillemets qui entourent le mot, et là j'ai un soucis avec la sortie, non seulement les guillemets de fermeture ne sont pas présents, mais en pus de çà cela me supprime le premier caractère de la chaîne.

    Je vous propose de jeter un œil à mon code ci-dessous :

    int main() {
    
        //Initialisation
        ifstream dico_file("dico.txt");
        int dico_counter(0);
        int dico_index(0);
        bool dico_stop(false);
        string mot_mystere_original("");
        string mot_mystere("");
        string quoted("");
    
        while(play == true) {
    
            //Sélection du mot dans le dico
            mot_mystere_original = "";
            mot_mystere = "";
            mot_melange = "";
    
            if(dico_file) {
    
                mot_mystere_original = "";
                dico_counter = 1;
                dico_index = rand() % NB_LIGNES_DICO;
                while(getline(dico_file, mot_mystere_original) && dico_stop == false) {
    
                    if(dico_counter == dico_index) { dico_stop = true; }
                    else {  dico_counter++; }
                }
    
            }
            else {
    
                cout << "ERREUR : Impossible d'ouvrir fichier le dictionnaire" << endl;
                play == false;
    
            }
    
            cout << mot_mystere_original << endl;
            mot_mystere = mot_mystere_original;
    
            quoted = "\"" + mot_mystere_original + "\"";
    
            /*
            output = "ADMIN : Le mot à deviner sera : \"";
            output+= mot_mystere_original;
            output+= "\"";
            cout << output << endl;
            */
            cout << quoted << endl;
            cout << "ADMIN : Le mot à deviner sera : " << quoted << endl;
            
            return 0;
    
        }
    
    }

    J'ai essayé de concaténer ma chaîne de différentes manière mais j'ai toujours la même erreur.

    Je n'ai pas le problème si je met la valeur de  "mot_mystere_original" en dur ou si je la récupère via un "cin".

    Est-ce que quelqu’un aurait des pistes à me proposer ?

    Merci d'avance pour votre aide.

    -
    Edité par Soundboy39 10 juin 2019 à 9:29:24

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2019 à 11:16:16

      Le cours de C++ d'OC est une calamité.

      Prenez un peu de temps sur ce forum pour trouver des sources pour des cours sur le C++ biens meilleurs.

      Concaténer des char* (comme les "\"") et des std::string, c'est assez casse-gueule.

      Un cours correct sur le C++ doit vous indiquez ce type danger.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        11 juin 2019 à 11:28:32

        C'est mes lunettes, ou la variable "play" n'est pas déclarée ?

        Si ça ne concatène pas bien, c'est que les données à concaténer ne sont pas bonnes.

        Conseil : pour débugger, faire afficher les données dès qu'elles sont lues.

        Autre conseil, ne déclarer les variables qu'à l'endroit où on sait ce qu'on va mettre dedans.

        Exemple, quoted ne doit être déclaré que ligne 41. Ne sert à rien avant, et ne fait qu'embrouiller.

        string quoted = "\"" + mot_mystere_original + "\"";


        Autre conseil : une boucle basée sur un compteur serait moins maladroite 

        int dico_index = rand() % NB_LIGNES_DICO;
        
        for (int i = 1; i < dico_index ; i++) { // sauter index-1 lignes
            string skipped;
            getline(dico_file, skipped);
        }
        
        string mot_mystere;
        getline(dico_file, mot_mystere);



        -
        Edité par michelbillaud 11 juin 2019 à 11:40:09

        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2019 à 21:19:52

          Merci pour vos réponses,

          michelbillaud a écrit:

          C'est mes lunettes, ou la variable "play" n'est pas déclarée ?

          Si ça ne concatène pas bien, c'est que les données à concaténer ne sont pas bonnes.

          Conseil : pour débugger, faire afficher les données dès qu'elles sont lues.

          En fait la variable "play" est bien déclarée, c'est juste que normalement mon code est plus conséquent, j'ai fait un peu de ménage pour ne poster que l’essentielle est la variable a été malencontreusement effacée.

          Je pense que le problème peut effectivement venir du fait que la variable "mot_mystere_original" est une chaine bancale... j'aimerais afficher les données dès qu'elles sont lues, mais commet procéder ??

          Parallèlement à çà, je vais remplacer mon While par un For.

          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2019 à 7:16:00

            pour afficher : avec std::cout << ma_chaine << std::endl;

            On peut d'ailleurs faire plus court et plus simple

            int dico_index = rand() % NB_LIGNES_DICO;
             
            string mot_mystere;
            
            for (int i = 0; i <= dico_index ; i++) { 
                getline(dico_file, mot_mystere);
            }


            Conseil : si on veut s'occuper du cas où les lectures échouent, il est préférable de lever une exception plutot que de trimballer/tester partout des indicateurs.

            -
            Edité par michelbillaud 12 juin 2019 à 7:19:38

            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2019 à 9:54:58

              Bonjour,

              la fonction std::getline() sait lire une ligne, elle élimine automatiquement un éventuel caractère '\n'. Attention si le fichier lu a été écris sous Windows et qu'il est utilisé par exemple sous Linux, un caractère supplémentaire '\r' sera lu à la fin des lignes (sous Windows il est ôté en même temps que le '\n' pour peu que le stream ne soit pas en mode binaire). C'est peut-être ce caractère qui perturbe. Dans ce cas il faudrait soit convertir le fichier, soit filtrer les caractères de contrôles inopportuns.

              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                13 juin 2019 à 20:01:24

                Merci Dalfab,

                Le problème venait bien de là, je travail sous Linux et le fichier a probablement du être fait sous Windows.

                J'ai réussi à régler le problème en appliquant cette solution : https://stackoverflow.com/questions/2528995/remove-r-from-a-string-in-c

                Encore merci à ceux qui m’ont répondu,

                Bonne fin de semaine,

                -
                Edité par Soundboy39 13 juin 2019 à 20:02:04

                • Partager sur Facebook
                • Partager sur Twitter

                Echappement double-quote déteriore l'output

                × 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