Partage
  • Partager sur Facebook
  • Partager sur Twitter

extraire des nombre d'une string

c++ qt

Sujet résolu
    21 décembre 2020 à 14:37:11

    bonjour,

    j'ai une variable qui contiens des info type : 

    /serveurIp_127.0.0.1

    ou :

    /serveurPort_34567

    je voudrais pouvoir récupère que 127.0.0.1 je penser a récupère tout ce qu'il y a après le "_" mais je n'ais aucune idée de comment on fait... :euh:

    pouvais vous m'aider ?

    merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2020 à 16:51:33

      Bonjour, en effet si les chiffres que tu veux récupérer sont toujours après le premier "_" de ta chaine de charactère tu peux chercher ce charactère dans ta chaine et copier tout ce qui suit dans une nouvelle chaine

      Tu peux écrire une fonction qui prend un paramètre une référence constante vers une chaine de charactère, un char à chercher pour faire la séparation et qui retourne une nouvelle chaine de charactère que tu construis au fur et à mesure que tu lis la chaine d'entrée

      Pour faire ça tu peux avoir recours aux itérateurs. Si tu n'est pas familier avec les itérateurs, voici un bon cours qui explique très bien la chose : https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/le-debut-du-voyage/deployons-la-toute-puissance-des-conteneurs/#1-le-socle-de-base-les-iterateurs

      Le chapitre sur les algorithmes un petit peu plus bas dans ce cours t'aidera à comprendre comment tu peux manipuler ces itérateurs sur des chaines de charactères ou des tableaux.

      L'exercice "Couper une chaine" que tu trouveras en descendant un peu dans le lien que je t'ai donné répondra parfaitement à ton besoin si tu l'adaptes un petit peu 

      -
      Edité par ThibaultVnt 21 décembre 2020 à 16:56:03

      • Partager sur Facebook
      • Partager sur Twitter
        21 décembre 2020 à 17:04:12

        Si se sont des QString ou assimilée, il y les fonctions indexOf (voir la doc de la classe).

        • Partager sur Facebook
        • Partager sur Twitter
          21 décembre 2020 à 17:25:49

          bonjour quand je fait :

              if (messagereceived.contains("/serveurIp_"))
              {
                  char const delimiteur { ' ' };
                  std::vector<std::string> parties {};
          
                  auto debut = std::begin(messagereceived);
                  auto fin = std::end(messagereceived);
                  auto iterateur = std::find(debut, fin, delimiteur);
          
                  while (iterateur != fin)
                  {
                      // Grâce à std::distance, nous obtenons la taille du mot.
                      std::string mot { debut, debut + std::distance(debut, iterateur) };
          
                      parties.push_back(mot);
                      // +1 pour sauter le délimiteur.
                      debut = iterateur + 1;
                      // Et on recommence.
                      iterateur = std::find(debut, fin, delimiteur);
                  }
          
                  // Ne pas oublier le dernier mot.
                  std::string mot { debut, debut + std::distance(debut, iterateur) };
                  parties.push_back(mot);
          
                  // On affiche pour vérifier.
                  for (std::string mot : parties)
                  {
                      ui->messagelist->append(mot);
          
                  }
              }

          le compilateur me ressort: 

          152: erreur : no viable conversion from 'std::string' (aka 'basic_string<char>') to 'const QString'

          up pour  jo_link_noir tu pourrais m'expliquer comment utiliser indexof et ce qui retourne exactement ?

          -
          Edité par unel 21 décembre 2020 à 17:36:11

          • Partager sur Facebook
          • Partager sur Twitter
            21 décembre 2020 à 17:39:47

            Tu fais un split là (c'est a dire séparer ta chaine en plusieurs sous chaine). Si tu sais que tu as qu'un seul _ et que si tu ne veux que l'adresse IP, c'est inutile de faire tout ca. Fais juste un find sur _ puis prend que la fin.

            Si messagereceived est un QString, tu peux aussi directement utiliser QString::split.

            Tu peux aussi regarder du coté des string_view, c'est un cas d'utilisation.

            Pour ton erreur, tu n'indiques pas la ligne qui produit l'erreur. 

            EDIT : jo t'a donné le lien vers la doc, tu as juste a lire et suivre le code d'exemple.

            -
            Edité par gbdivers 21 décembre 2020 à 17:40:48

            • Partager sur Facebook
            • Partager sur Twitter
              21 décembre 2020 à 19:14:18

              bonjour la ligne ou se produis l'erreur est la ligne 29.

              pour reponse a gbdivers j'ai fait un QString::split voici mon code:

                  if (messagereceived.contains("/serveurIp_"))
                  {
                      auto parts = messagereceived.split(QLatin1Char('_'));
                      // parts: {"serveurIP","127.0.01"}
                      ui->messagelist->append(parts[2]);
                  }

              et j'obtiens ceci:



              • Partager sur Facebook
              • Partager sur Twitter
                21 décembre 2020 à 20:24:35

                Es tu sur que "parts[2]" est valide ?

                Ton erreur ici est que tu ne verifies pas tes accès aux tableaux.

                (Spoiler, c'est pas valide. Si tu as 2 elements, leurs index seront 0 et 1, pas 1 et 2)

                • Partager sur Facebook
                • Partager sur Twitter
                  21 décembre 2020 à 20:57:33

                  ha zut mon Français me rattrape

                  youpiiiiiiiiiiiiiiiiiiiiiiiiiiii ca marche Nikel merci a tous 

                  ha non je me prend une SIGEGV :

                   il apparait a la fermeture du programme

                  -
                  Edité par unel 21 décembre 2020 à 21:09:52

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 décembre 2020 à 11:16:03

                    Bonjour,

                    On ne sait pas les modifications que tu as apportées. Et il y a des grandes chances que ton nouveau problème provienne d'une tout autre cause.
                    Il faut utiliser le débuggeur et voir ce qu'il y a dans la "call stack" au moment où se produit la SIGSEGV

                    • Partager sur Facebook
                    • Partager sur Twitter

                    En recherche d'emploi.

                      25 décembre 2020 à 17:31:03

                      Hello,

                      Aussi simple que :

                      std::string exemple = "/serveurIp_127.0.0.1";
                      
                      std::string ip = exemple.substr(exemple.find('_') + 1);

                      Si le string exemple ne contient pas d'underscore, il n'y aura pas d'erreur, ip sera juste vide.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 décembre 2020 à 9:55:07

                        alors quand je teste avec un point d'arrêt aucun problèmes ... mais quand je teste sans je me reprend l'erreur

                        quand j'exécute sans compilé ca donne ca 

                        edit

                        effectivement l'erreur ne Vien pas de la fonction ... elle Vien de 

                        void client::disconnected()
                        {
                        
                            ui->messagelist->append("deconectée du serveur!"); // ici
                            ui->messagelist->append("tentative de reconexion...");
                            ui->conectbutton->click();
                        }

                        avec un point daret il se passe ca :

                        a la ligne 930 de QString.h  ici ligne 4

                        #if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
                            QT_ASCII_CAST_WARN inline QString(const char *ch)
                                : QString(fromUtf8(ch))
                            {} //ici-----------ici-----------ici-----------ici-----------ici-----------ici-----------ici-----------
                        QT_ASCII_CAST_WARN inline QString(const QByteArray &a)
                                : QString(fromUtf8(a))
                            {}
                            QT_ASCII_CAST_WARN inline QString &operator=(const char *ch)
                            { return (*this = fromUtf8(ch)); }
                            QT_ASCII_CAST_WARN inline QString &operator=(const QByteArray &a)
                            { return (*this = fromUtf8(a)); }
                        
                            // these are needed, so it compiles with STL support enabled
                            QT_ASCII_CAST_WARN inline QString &prepend(const char *s)
                            { return prepend(QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &prepend(const QByteArray &s)
                            { return prepend(QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &append(const char *s)
                            { return append(QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &append(const QByteArray &s)
                            { return append(QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const char *s)
                            { return insert(i, QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &insert(qsizetype i, const QByteArray &s)
                            { return insert(i, QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &operator+=(const char *s)
                            { return append(QString::fromUtf8(s)); }
                            QT_ASCII_CAST_WARN inline QString &operator+=(const QByteArray &s)
                            { return append(QString::fromUtf8(s)); }
                        
                            QT_ASCII_CAST_WARN inline bool operator==(const char *s) const;
                            QT_ASCII_CAST_WARN inline bool operator!=(const char *s) const;
                            QT_ASCII_CAST_WARN inline bool operator<(const char *s) const;
                            QT_ASCII_CAST_WARN inline bool operator<=(const char *s) const;
                            QT_ASCII_CAST_WARN inline bool operator>(const char *s) const;
                            QT_ASCII_CAST_WARN inline bool operator>=(const char *s) const;
                        
                            QT_ASCII_CAST_WARN inline bool operator==(const QByteArray &s) const;
                            QT_ASCII_CAST_WARN inline bool operator!=(const QByteArray &s) const;
                            QT_ASCII_CAST_WARN inline bool operator<(const QByteArray &s) const;
                            QT_ASCII_CAST_WARN inline bool operator>(const QByteArray &s) const;
                            QT_ASCII_CAST_WARN inline bool operator<=(const QByteArray &s) const;
                            QT_ASCII_CAST_WARN inline bool operator>=(const QByteArray &s) const;
                        
                            QT_ASCII_CAST_WARN friend bool operator==(const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
                            QT_ASCII_CAST_WARN friend bool operator!=(const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
                            QT_ASCII_CAST_WARN friend bool operator< (const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
                            QT_ASCII_CAST_WARN friend bool operator> (const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
                            QT_ASCII_CAST_WARN friend bool operator<=(const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
                            QT_ASCII_CAST_WARN friend bool operator>=(const char *s1, const QString &s2)
                            { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
                        #endif

                        ca crash

                        -
                        Edité par unel 27 décembre 2020 à 19:02:45

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 décembre 2020 à 13:30:46

                          EneeDiIorio1 a écrit:

                          up

                          Ton deuxième problème n'a rien à voir avec ta question initiale (extraction d'une IP contenue dans un string). Tu ferais mieux de marquer ce sujet comme résolu et d'ouvrir une nouvelle question. 

                          (Sinon, ce thread va vite se transformer en devblog)

                          • Partager sur Facebook
                          • Partager sur Twitter

                          extraire des nombre d'une 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