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 :

saisie getline string


Sujet :

C++

  1. #1
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut saisie getline string
    Bonjour,

    la fonction getline est zapp�e:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <string>
    #include "entrees.hpp"
     
    int main(){
      int choix;
      while( ! saisir_int(choix,"entrez un nombre: "))
        ;
      std::string X;
      saisir_string(X,"entrez une chaine");
      std::cout<<X<<std::endl;
    }
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <limits>
     
    void vider_buffer();
     
    void saisir_string(std::string &variable, const std::string &message){
      while(true){
        std::cout << message;
        std::getline(std::cin, variable); 
        if(std::cin.bad() || std::cin.eof()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
          if(std::cin.eof()){
    	break;
          }
          vider_buffer();
        }
        else if(std::cin.fail()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
          vider_buffer();
        }
        break;
      }
    }
     
    bool saisir_int(int &variable, const std::string &message){
      std::string temp;
      while(true){
        std::cout << message;
        std::cin >> temp;
        if(std::cin.bad() || std::cin.eof()){
          std::cerr<<"Une erreur interne est survenue." << std::endl;
          if(std::cin.eof()){
    	return false;
          }
          vider_buffer();
          continue;
        }
        else if(std::cin.fail()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
          vider_buffer();
          continue;
        }
        vider_buffer();
        std::istringstream stream(temp);
        stream >> variable;
        if(stream.fail() || !stream.eof()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
        }
        else{
          return true;
        }
      }
      return false;
    }
     
     
    void vider_buffer(){
      std::cin.clear();
      std::cin.seekg(0, std::ios::end);
      if(!std::cin.fail()){
        std::cin.ignore(std::numeric_limits<std::streamsize>::max());
      }
      else
        std::cin.clear();
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    entrez un nombre: 3
    entrez une chaine
    j'ai trouv� ces fonctions ici:
    http://sdz.tdct.org/sdz/la-saisie-securisee-en-c.html

    quelqu'un a une id�e?

  2. #2
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    Je me suis peut-�tre mal expliqu�.
    la ligne std::getline(std::cin, variable); est ignor�e � l�ex�cution. variable est affect� de la chaine vide.
    j'aurai besoin de saisir une chaine apr�s avoir saisi un entier
    quelqu'un aurai une id�e?

  3. #3
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    si j'ajoute vider_buffer avant la saisie de la cha�ne, cela ne change rien

    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
    void saisir_string(std::string &variable, const std::string &message){
      while(true){
        std::cout << message;
        vider_buffer();
        std::getline(std::cin, variable); 
        if(std::cin.bad() || std::cin.eof()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
          if(std::cin.eof()){
    	break;
          }
          vider_buffer();
        }
        else if(std::cin.fail()){
          std::cerr << "Erreur, saisie incorrecte." << std::endl;
          vider_buffer();
        }
        break;
      }
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void vider_buffer(){
      std::cin.clear();
      std::cin.seekg(0, std::ios::end);
      if(!std::cin.fail()){
        std::cin.ignore(std::numeric_limits<std::streamsize>::max());
      }
      else
        std::cin.clear();
    }
    une id�e?

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    Les fonctions de saisie sont inutilement complexes. Entre autre avec des std::endl sur std::cerr qui n'est pas buff�ris�, pas de std::flush apr�s les std::cout!

    Quant � la fonction vider_buffer(), elle utilise seekg() qui n'a pas de sens sur un un flux. Il faudrait plus simplement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void vider_buffer(){
      std::cin.clear();
      std::cin.ignore( std::numeric_limits<std:streamsize>::max() );
    }

  5. #5
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    Merci pour la r�ponse.

    Avec le vider_buffer que tu me propose, le message "entrez une chaine" ne s'affiche plus. Le programme lit un entier et ne passe pas � la suite.

    mes saisies compliqu�es sont expliqu�s ici:http://sdz.tdct.org/sdz/la-saisie-securisee-en-c.html

    sinon,j'ai le m�me probl�me avec ce code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
     
    int main(){
      int n;
      std::cout<<"entrez un nombre"<<std::endl<<std::flush;
      std::cin>>n;
      std::cout<<"entrez une chaine"<<std::endl<<std::flush;
      std::string X;
      std::getline(std::cin,X);
      std::cout<<X<<std::endl<<std::flush;
    }
    quand il demande une cha�ne, getline est zapp�e et X ne contient rien:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    $ ./a.out 
    entrez un nombre
    5
    entrez une chaine
     
    $
    une id�e?

  6. #6
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    �a marche avec std::cin.ignore:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    int main(){
      int n;
      std::cout<<"entrez un nombre"<<std::endl<<std::flush;
      std::cin>>n;
      std::cout<<"entrez une chaine"<<std::endl<<std::flush;
      std::string X;
      std::cin.ignore();
      std::getline(std::cin,X);
      std::cout<<X<<std::endl<<std::flush;
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    $ ./a.out 
    entrez un nombre
    54
    entrez une chaine
    bonjour toi
    bonjour toi

  7. #7
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    J'ai abandonn� les saisies compliqu�es car �a ne marchait toujours pas. Voici la derni�re version:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    #include "partie.hpp"
     
    int main(){
      partie jeu;
    }
    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
    35
    36
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iostream>
    #include <random>
     
    #include "partie.hpp"
     
    partie::partie(){
      std::random_device rd;
      std::mt19937 gen(rd());
      std::uniform_int_distribution<int> distrib_profession(0,11);
      int choix;
      do{
        std::cout<<"Combien de joueurs pour cette partie? "<<std::endl<<std::flush;
        std::cin>>choix;
        if(choix<1||choix>6)
          std::cout<<"le nombre de joeurs doit être compris enetre 1 et 6"<<std::endl;
      }while(choix<1||choix>6);
      std::string nom_joueur;
      int numero_profession;
      std::vector<int>profession_utilisee;
      for(int i=0;i<choix;i++){
        std::cout<<"nom du joueur "<<i+1<<": ";
        std::cin.ignore();
        std::cin>>nom_joueur;
        do
          numero_profession=distrib_profession(gen);
        while ( find(profession_utilisee.begin(),profession_utilisee.end(),numero_profession) != profession_utilisee.end());
        profession_utilisee.push_back(numero_profession);
        std::cout<<"Joueur "<<nom_joueur<<", votre profession est "<<liste_professions[numero_profession]<<std::endl;
        joueur temp(liste_professions[numero_profession]);
        liste_joueurs.push_back(temp);
        liste_noms.push_back(nom_joueur);
      }
    }

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    L'autre solution �tant de ne faire que des getline(), puis faire tes conversions sur la ligne saisie avec un istringstream.
    Avec �a, tu ne devrais plus avoir de soucis de caract�res "laiss�s" dans le flux d'entr�e.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    un exemple?

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Un exemple:
    Code C++ : 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
    #include <iostream>
    #include <string>
    #include <sstream>
     
    int getline_main(){
    	int n;
    	std::string line;
    	std::cout<<"entrez un nombre"<<std::endl; //De mémoire, endl implique déjà flush
    	std::getline(std::cin, line);
    	std::istringstream(line) >> n;
    	std::cout<<"entrez une chaine"<<std::endl;
    	std::string X;
    	std::getline(std::cin,X);
    	std::cout<<X<<std::endl;
    	return EXIT_SUCCESS;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    oui �a marche

  12. #12
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Probl�me classique d'enchainement de getline apr�s >>. La question est trait�e dans la FAQ (comme plusieurs des autres que tu as post�es)

    https://cpp.developpez.com/faq/cpp/?...ligne-soit-lue
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  13. #13
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16

  14. #14
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Que de la m�me fa�on, j'avais mis dans la FAQ il y a fort longtemps tout ce qu'il faut pour v�rifier les saisies clavier.
    Sinon, trop de mots et pas lisible l'article. Parle de choses inutiles (seekg()), et d'autres � bannir (std::istream::getline -- � ne pas confondre avec std::getline)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  15. #15
    Membre �clair�

    Homme Profil pro
    d�veloppeur � la maison
    Inscrit en
    Septembre 2006
    Messages
    405
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : d�veloppeur � la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 405
    Billets dans le blog
    16
    Par d�faut
    Merci pour les pr�cisions, je prend note

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Saisie de String.
    Par kek_8 dans le forum Java ME
    R�ponses: 3
    Dernier message: 20/03/2008, 18h43
  2. remplir un champs dans HSQL avec un String saisi
    Par lampoulchon dans le forum JDBC
    R�ponses: 3
    Dernier message: 01/02/2008, 19h30
  3. saisi d'un String entier
    Par ke2007 dans le forum D�buter avec Java
    R�ponses: 6
    Dernier message: 19/08/2007, 12h12
  4. Probl�me getline(ifstream, string)
    Par OliverSleep dans le forum C++Builder
    R�ponses: 2
    Dernier message: 24/05/2007, 17h09
  5. getline string integer
    Par Gebudi. dans le forum C++
    R�ponses: 9
    Dernier message: 28/05/2006, 08h23

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