Partage
  • Partager sur Facebook
  • Partager sur Twitter

tableau de caratères 2D et utilisation cin.getline

    30 mars 2020 à 20:40:22

    Bonjour,

    Dans le cadre de mes études, j'ai différents exercices à réaliser en c++ (je débute).

    Je souhaite réaliser un tableau à 2D dont chaque ligne correspond à une chaine de caractère. J'ai écrit ça pour l'instant :

    char liste[10][500];
    int ligne(0),nbchaine(0)
    
    ligne = nbchaine+1; cout<<"Tapez votre chaine de caractères : "; cin.ignore(); cin.getline(liste[ligne],500); nbchaine++;


    De cette manière avec la fonction cin.getline je cherche à écrire dans la ligne définie juste au dessus.

    Le soucis c'est que plus loin dans mon programme lorsque je souhaite afficher le tableau, cela ne fontionne pas et l'affichage devient : 0x7ffeefbfe1e0


    J'imagine que cela vient de la manière dont je souhaite utiliser cin.getline qui pose problème. je souhaiterai pouvoir mettre la chaine de caractère dans la ligne n°"ligne" du tableau

    Avez-vous quelques pistes pour me débloquer ?

    Merci :)

    -
    Edité par PoloGry 30 mars 2020 à 20:59:08

    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2020 à 21:18:16

      std::istream::getline ne doit pas être utilisée. C'est une catastrophe en termes de sécurité. Considère qu'elle n'existe pas.

      En C++, depuis 1998, c'est comme ceci que nous lisons des ensembles de chaines depuis le clavier

      std::vector<std::string> des_lignes;
      std::string une_ligne;
      
      const int N = 42;
      for (int i = 0; (i != N) && std::getline(std::cin, une_ligne) ; ++i) {
          des_lignes.push_back(une_ligne);
      }
      
      std::cout << "il y a " << des_lignes.size() << " lignes\nQui sont:";
      
      // Syntaxe C++11
      for (auto const& l : des_lignes)
          std::cout << " -> " << l << "\n";
      

      Ca fait des plombes que la bonne façon de faire est dans la FAQ: https://cpp.developpez.com/faq/cpp/?page=Manipulation-des-fichiers#Comment-faire-pour-lire-un-fichier-ligne-par-ligne

      PS: ton problème est que tu gères mal tes indices. Et rappelons-le, en C, C++, Java..., les tableaux commencent à 0.

      -
      Edité par lmghs 30 mars 2020 à 21:20:47

      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        30 mars 2020 à 22:07:07

        Merci beaucoup pour ton message.

        Je débute et je ne comprend pas ce soucis de sécurité lorsqu'il s'agit seulement d'un exercice de cours.

        Dans le cadre de mon cours nous avons vu la fonction cin.getline, c'est pour cela que je souhaite l'utiliser.

        Comment puis-je l'utiliser afin de lire la chaine de caractère tapé à l'écran pour ensuite la stocker dans le tableau à deux dimensions "liste" sur la ligne dont le numéro réfère à la valeur renvoyé par la variable "ligne ?

        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2020 à 11:46:39

          Salut,

          Déjà, pourquoi diable voudrais tu utiliser un tableau à deux dimensions de caractères?

          Si ce sont des chaînes de caractères que tu veux stocker, utilises la classe qui est faite pour: std::string.

          Si tu veux en stocker "un certain nombre" utilise les classes de tableaux qui existent: std::array si tu connais le nombre de chaines à stocker à la compilation, std::vector si ce nombre peut varier au fur et à mesure de l'exécution.

          C'est à dire que, si tu veux stocke spécifiquement dix chaines de caractères, tu  devrais utiliser un code proche de

          // pour les chaines de caractères
          #include <string>
          // pour std::cin et std::cou
          #include iostream
          int main(){
              std::array<std::string, 10> tab;
              for(int i=0; i<tab.size(); ++i){
                  std::string temp;
                  /* parce que l'on compte généralement à partir de 1
                   * alors que les indices commencent à 0
                   */
                  std::cout<<"veuillez introduire la chaine n° "<<i+1<<": ";
                  std::getline(std::cin, temp);
                  tab[i]= temp;
              }
              /* et pour les afficher */
              for(auto const & it : tab)
                  std::cout<<it<<"\n";
          }

          Si tu veux stocker "un nombre inconnu à l'avance" de chaines de caractères, il faudra le faire sous une forme proche de

          #include <string>
          #include <iostream>
          int main(){
              std::vector<std::string> tab;
              std::string choice;
              bool again{true}
              while(again){
                  std::cout<<"Veuilez introduire la chaine "<<tab.size()+1<<": ";
                  std::string temp;
                  std::getline(std::cin, temp);
                  tab.push_back(temp);
                  do{
                  std::cout<<"voulez-vous continuer (O / N)?";
                  while(choice != "o" && 
                        choice != "O" && 
                        choice != "n" &&
                        choice != "N") {
                      std::getline(std::cin, choice);
                      /* on accepte "o", "O", "n" ou "N" comme réponse
                       * toutes les autres afficheront un message d'erreur
                       * avant de redemander le choix
                       */
                      if(choice == "o" || choice == "O")
                          again = true;
                      else if(choice == "n" || choice == "N")
                          again = false;
                      else
                          std::cout<<"veuillez répondre par 'O', 'o'"
                                   <<"'N' ou 'n' uniquement\n";
                  }
              }
              /* l'affichage final */
              std::cout<<"Vous avez introduit "<<tab.size() 
                       <<" chaines de caracteres que voici: \n";
              for(auto const & it : tab)
                  std::cout<<it<<"\n";
          
          
          }

          IL N'Y A PAS A SORTIR DE LA!!!

          Cela fait plus de vingt ans que l'on se bat pour que les gens comprennent que LE C++ N'A PLUS RIEN A VOIR AVEC LE C!!!Il serait temps que les profs finissent par le comprendre, tu ne crois pas?

          PoloGry a écrit:

          Je débute et je ne comprend pas ce soucis de sécurité lorsqu'il s'agit seulement d'un exercice de cours.

          Simplement parce que, si c'est pour apprendre à faire de la saloperie qui fera planter ton programme à la première occasion, cela ne sert strictement à rien:

          1. tu n'arriveras jamais à avoir un programme qui fonctionne comme tu le veux, et cela te dégoutera du C++ tant que
          2. tu ne te sera pas forcé à oublier tout ce que tu as appris pour réapprendre à faire les choses correctement

          Le (1) est déjà embêtant en soi, parce que beaucoup de gens considère C++ comme "trop compliqué", alors que c'est -- effectivement un langage complexe, ce n'est pas un langage compliqué (bizarre, non?) et le (2) est carrément catastrophique, car il est très difficile de changer les habitudes qui ont été prises, surtout quand ce sont les premières habitudes que l'on a prises et donc les plus anciennes.

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            31 mars 2020 à 15:36:29

            Salut,

            Merci beaucoup pour ta réponse. Je vais m'inspirer des codes que tu as indiqué pour répondre à mon problème.

            Je souhaitais utiliser un tableau à 2 dimensions pour stocker sur chaque ligne une chaine de caractère différente.

            Merci encore pour votre aide :)

            • Partager sur Facebook
            • Partager sur Twitter

            tableau de caratères 2D et utilisation cin.getline

            × 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