IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Séparer une chaine et la vérifier.


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Points : 34
    Points
    34
    Par défaut Séparer une chaine et la vérifier.
    Salut, je fais un exercice proposé sur un autre site, le but est d'utiliser la console pour mettre un argument sur le programme et de l'afficher.

    (ex: tests.exe "Salut tout le monde")

    Afin de ne pas surcharger une ligne, j'ai décidé d'en faire une autre quand la première contient 39 caractère, et d'en faire une troisième si la deuxième en contient 39 également.
    Pour cela j'utilise substr et erase.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string chaine = argv[1];
        string chaine2 = chaine.substr(39);
        chaine.erase(39);
        string chaine3 = chaine2.substr(39);
        chaine2.erase(39);
    Jusque là tout fonctionne, j'ai testé avec cout et tout est bien découpé.
    Je n'applique pas la méthode erase sur la chaine3, car c'est ce qui me permet de vérifier que le message n'est pas trop long.
    Maintenant, avec des if et else if, je vérifie si la chaine2 contient plus d'un caractere, si oui j'affiche le message sur deux ligne, de même pour la chaine3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    if(chaine2.size() < 1)
        {
            cout << " " << haut << endl;
            cout << "< " << chaine << " >" << endl;
            cout << " " << bas << endl;
        }
        else if(chaine3.size() < 1)
        {
            cout << " " << haut << endl;
            cout << "/ " << chaine << " \"" << endl;
            cout << "\ " << chaine2 << " /" << endl;
            cout << " " << bas << endl;
     
        }
        else if(chaine3.size() < 40)
        {
            cout << " " << haut << endl;
            cout << "/ " << chaine << " \"" << endl;
            cout << "| " << chaine2 << " |" << endl;
            cout << "\ " << chaine3 << " /" << endl;
            cout << " " << bas << endl;
        }
        else
        {
            cout << "Message trop grand !" << endl;
            return 0;
        }
    haut et bas sont juste des "remplisseurs":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for(int i=0; i<chaine.size()+3; i++)
        {
            haut+="_";
            bas+="-";
        }
    Ensuite, on affiche la vache:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        cout << "	 \   ^__^" << endl;
        cout << "	  \  (oo)\_______" << endl;
        cout << "	    (__)\       )\/\"" << endl;
        cout << "	         ||----W |" << endl;
        cout << "	         ||     ||" << endl;
    Le programme fonctionne très bien si le message contient + de 78 caracteres (soit trois ligne) mais affiche une erreur si non.




    C'est peut être la fatigue mais je ne vois pas où je me suis trompé.

    Merci du coup de main !
    Bonne nuit ^^

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    C'est indiqué, substr lance une exception out_of_range.
    D'après la doc
    Exception safety
    Strong guarantee: if an exception is thrown, there are no changes in the string.

    If pos is greater than the string length, an out_of_range exception is thrown.
    A bad_alloc exception is thrown if the function needs to allocate storage and fails.
    substr(39) échoue si ton string fait moins de 39 caractères (ce que tu observes d'ailleurs).

    Un petit test if(chaine.size() >= 39) et le problème est réglé.

    Sinon, "\" doit être échappé : "\\".

  3. #3
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Merci ahah, tu ne dors jamais toi .

    En tout cas merci, tu m'aides dans deux problèmes, je suis crevé alors j'ai pas trop cherché .

    J'essayes ça après je te tiens au courant !

    EDIT: et bien ça fonctionne, merci bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Séparer une chaine de caractères sans split
    Par ndsaerith dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 24/05/2011, 16h05
  2. Séparer une chaine de caractère
    Par fabienschmitt dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 08/11/2006, 14h57
  3. Réponses: 15
    Dernier message: 23/01/2006, 04h35
  4. Séparer une chaine en 2
    Par zoubidaman dans le forum SQL
    Réponses: 6
    Dernier message: 15/06/2005, 23h11
  5. Séparer une chaine en sous chaine
    Par firemax dans le forum C
    Réponses: 9
    Dernier message: 03/06/2005, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo