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

SL & STL C++ Discussion :

String & espace


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 24
    Par défaut String & espace
    Bonjour a tous,

    Voila un pb se pose à moi en C++. Je travaille sous Dev-C++.

    Je dois faire une fonction de saisie, et il me faut récupérer une phrase avec les espaces.

    Ex: Je rentre au clavier "S -> i E t s T | a"
    et le string temp est égale à "S -> i E t s T | a"

    Pour le moment si je fait un simple:
    J'obtiens "S" ds mon string temp, c'est normal cin s'arrete au espace.

    Mais alors que faire???

    J'ai cherché, j'ai trouvé:
    1) getline mais ca n'accepte que des char.
    2) une fonction a programme soit meme utilisant les entree/sorties standart du C, bof bof en plus faut encore préciser la taille.

    Ca me parait bizarre qu'il existe pas une possibilité en C++ pr rentrer une phrase ds un string.

    Merci de votre aide.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    1) getline mais ca n'accepte que des char
    Mauvais getline
    L'autre version est plus sympathique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string s;
    getline(cin, s);
    http://c.developpez.com/faq/cpp/?pag...ture_par_ligne

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            cout << "Regle: ";
            //cin >> temp;
            getline(cin, temp);
            cout << "La regle taper est: " << temp << endl;
    Bon voila j'ai tape ce que tu m'as dit et qd je lande le exe, ba le resultat donne ca:

    Regle: La regle taper est:
    Il ne me laisse pas le tps de rentrer la regle??

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    getline laisse parfois trainer des caractères dans le buffer d'entrée. Il faut donc le vider de temps en temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin.ignore(numeric_limits<int>::max(), '\n');

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 24
    Par défaut
    fonctionne pas chez moi il me dit:

    170 untitled1.cpp
    `numeric_limits' undeclared (first use this function)
    170 untitled1.cpp
    (Each undeclared identifier is reported only once
    170 untitled1.cpp
    for each function it appears in.)
    170 untitled1.cpp
    parse error before `>'
    170 untitled1.cpp
    no matching function for call to `max ()'
    170 untitled1.cpp
    parse error before `)'


    J'ai essaye de mettre la bibliotheque #include <limits>
    ou #include <limits.h> mais rien a faire

    C'est peut etre du au compilateur?

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Il doit te manquer un using namespace std;
    c'est <limits>, sans le .h
    Quelle est ton utilisation de cin avant ce getline ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 80
    Par défaut
    Salut j'ai eu ce problem aussi et ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cin.ignore(numeric_limits<int>::max(), '\n');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cin.ignore(cin.rdbuf()->in_avail());
    n'as marcher mais je dis un gran merci a djar qui m'a filer son code qui marche bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    inline void flush()
    { 
       /*Remettre le buffer à zero
        Clear ne marchera pas seul:
        Ignorer tous les caractères du buffer
        jusqu'au caractère 'Nouvelle ligne' compris
        -> fait par djar*/
       cin.clear();
       cin.ignore(20000, '\n');
    }
    cependant il faut je pense un '\n' de deja rentre si non il vous le demande je n'es pas tout a fait fini de le tester voila
    et merci a toi djar

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin.ignore(numeric_limits<int>::max(), '\n');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inline void flush()
    {
       cin.clear();
       cin.ignore(20000, '\n');
    }
    C'est exactement la même chose, à deux trucs près :

    - Entre un 20000 arbitraire et la valeur max d'un int, le second choix sera plus "sûr" (même si en pratique on aura très rarement un buffer plein à plus de 20000 caractères).
    - cin.clear() remet le flux dans un état valide s'il n'y était pas, mais c'est indépendant de notre problème de vidage du buffer. Le fait qu'il reste des caractères dans le flux ne mettra pas celui-ci dans un état invalide.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 24
    Par défaut
    Merci finallement j'ai reussi.
    Voici la derniere solution que j'ai retenue pr ceux ki auront le meme pb que moi plus tard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char temp[1024+1];         //Char pour pouvoir avec les entrées récupérer des espaces
    cout << endl << "\t" << "Saisir une Regle puis appuyer sur [ENTER]: ";
            cin.ignore(1024, '\n');          //Vidage du buffer
            cin.getline(temp, sizeof(temp));      //Variable temporaire prenant la valeur saisie au clavier espaces inclu
    Merci a tous et je click sur resolu

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je crois qu'utiliser cin.sync() revient au même que ignore().

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    2 petites remarques :

    - Pourquoi 1024 et pas numeric_limits<streamsize>::max() ? (ou INT_MAX si la syntaxe te paraît trop longue)

    - La version membre de getline est à éviter, utilise plutôt la version non membre qui travaille elle sur des string.

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

Discussions similaires

  1. string avec espace -> xml
    Par Pitou5464 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/01/2008, 15h23
  2. Convertir une string avec espace en Single
    Par shirya dans le forum C#
    Réponses: 24
    Dernier message: 23/03/2007, 09h20
  3. [String]Enlever espaces au debut d'une ligne
    Par julien1981 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 28/06/2006, 18h00
  4. [XSL] Transformation de string avec espaces
    Par VolaiL dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 19/05/2006, 15h52
  5. [String]effacer espaces en trop
    Par showlap1 dans le forum Langage
    Réponses: 9
    Dernier message: 24/11/2005, 17h40

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