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 :

getline et cin


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 8
    Par défaut getline et cin
    Bonjour à vous,


    Je débute évidemment en c++ et j'ai reçu un exercice à faire sur les string. L'exercice ne me pose pas de problème mais je dois utiliser un getline pour entrer un string qui possède au moins un espace et j'ai un petit soucis.
    En effet, j'ai remarqué que si j'avais demandé un cin plus haut dans le code, le getline de la ligne 32 ne fonctionne pas (il ne me demande même pas de faire une entrée clavier).

    Le bout de code :

    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
    28
    29
    30
    31
    32
    33
    34
    bool inclus(const string& ssch, const string& ch) {
        bool answer = false;
        unsigned int index = 0;
        int target = 0;
        while ((index < ch.size()) && (answer == false)) {
            if (ch[index] == ssch[target]) {
                ++target;
                if (target == ssch.size()) answer = true;
            }
            ++index;
        }
        return answer;
    }
     
    int main() {
        string sousChaine = "";
        string chaine = "";
        string ch1 = "mamzannnn";
        string ch2 = "mamzan";
        string marmelade;
     
        cout << " Quelle chaine ?" << endl << " ";
        cin >> chaine;
        cout << " Quelle sous chaine ?" << endl << " ";
        cin >> sousChaine;
        cout << (inclus(sousChaine, chaine)?" Oui c'est inclus !":" Non ce n'est pas inclus !");
     
        if (compare(ch1,ch2) == 0) cout << " Les deux chaines sont les memes !";
        else if (compare(ch1,ch2) > 0) cout << " La chaine CH1 est apres dans l'ordre alphabetique !";
        else cout << " La chaine CH1 est avant la CH2 dans l'ordre alphabetique !";
     
        getline(cin,marmelade);
        cout << marmelade;
    }
    Si je mets les cin des lignes 23 et 25 en commentaire, ça fonctionne très bien.
    J'ai essayé de faire un cin.clear() mais ça ne fonctionne toujours pas.
    J'utilise codeblock 13.12 comme environnement de dev.

    Merci de prendre la peine de m'aider


    Xavier P.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonsoir.

    En effet, il y a un effet caché.

    Si tu utilises std::getline après un std::cin, il va trouver un retour à la ligne ('\n') que std::cin n'avait pas traité, et ne va rien faire.

    On peut forcer std::cin à ignorer ce caractère, avec la méthode ignore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //ignore les retours à ligne pour que getline fonctionne comme attendu
    getline(cin, marmelade);
    cout << marmelade;
    Note qu'il faudra inclure le header #include <limit> pour utiliser numeric_limits.

    Source : cppreference

    Edit: fichtre !

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 8
    Par défaut
    Merci à vous deux

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Pfiou, j'ai rarement vu truc aussi complexe! Et faux : si tu cherches toto dans to1to tu retournes true. Ce que je ne pense pas voulu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ((index < ch.size()) && (answer == false)) {
            if (ch[index] == ssch[target]) {
                ++target;
                if (target == ssch.size()) answer = true;
            }
            ++index;
        }
    std::string::compare ou au pire std::string::substr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(size_t i = 0; i < ch.length(); ++i)
    {
      if(ch.compare(i, ssch.length(), ssch) == 0)
        return true;
    }
    return false;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 8
    Par défaut
    Si c'était voulu, c'était dans l’énoncé... Et c'est des exercices pour débutant, donc on évite justement de nous faire utiliser ce qui existe déjà.
    De plus, on nous impose d'avoir un seul return dans une fonction.

    T'es sans doute un modérateur, mais tu manques beaucoup de sympathie en tout cas, sans compter que tu es hors sujet ...

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

Discussions similaires

  1. cin.getline et cin.ignore
    Par Ziarrow dans le forum C++
    Réponses: 6
    Dernier message: 28/08/2010, 18h46
  2. cin suivi de getline
    Par geek67 dans le forum Débuter
    Réponses: 8
    Dernier message: 18/06/2009, 00h53
  3. cin.getline et char * vide
    Par sawbo1 dans le forum SL & STL
    Réponses: 6
    Dernier message: 29/09/2006, 15h24
  4. Réponses: 1
    Dernier message: 21/08/2006, 19h17
  5. getline(cin,s) pas pris en compte ?
    Par FinalSpirit dans le forum SL & STL
    Réponses: 3
    Dernier message: 19/01/2006, 01h18

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