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 :

controle saisie


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut controle saisie
    bonsoir
    je regardais la faq c++ pour controler les saisies d'entier et j'ai essayais de faire pareil avec des caractères. cela fonctionne bien mais en rentrant un chiffre je n'ai pas la phrase de saisie incorrecte est ce normal?
    merci

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait, quoi que tu saisisses ça devrait être valide non, vu que ça pourra toujours être extrait vers un char ?
    Ce ne serait pas un contrôle de longueur (pas plus d'un caractère saisi) + un contrôle de "domaine" (le caractère doit être alpha, par exemple) dont tu aurais besoin ?

    Bon si je suis dans le mauvais corrige moi et précise le genre de test que tu voudrais effectuer

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    ben tu n'as pas tout a fait tort il faut seulement que l'utilisateur rentre une lettre et pas une chaine. et cette lettre doit etre compris dans un intervalle : entre b et p par exemple

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    il faut seulement que l'utilisateur rentre une lettre et pas une chaine
    Bah, parfois j'aime bien tout rentrer d'un coup avant que le programme ne me le demande (quand tu passes ton temps à rentrer des valeurs pour tester ton programme c'est plus pratique). Et puis si tu lis ton entrée à partir d'un fichier ça posera problème aussi, de limiter ainsi la taille de l'entrée. Donc à mon avis, ne te soucie pas de ça.

    et cette lettre doit etre compris dans un intervalle : entre b et p par exemple
    Façon pas portable (parait-il) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((c < 'b') || (c > 'p'))
        // Erreur...
    Façon portable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::string Valide = "bcdefghijklmnop";
    if (Valide.find(c) == std::string::npos)
        // Erreur...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    je teste ca ce soir merci

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((c < 'b') || (c > 'p'))
        // Erreur...
    Pas portable car valable qu'en ASCII, pas EBCDIC.
    Voir ici par exemple.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Trap D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((c < 'b') || (c > 'p'))
        // Erreur...
    Pas portable car valable qu'en ASCII, pas EBCDIC.
    Voir ici par exemple.
    Merci pour l'info
    Dans quel genre d'environnement travaille-t-on en EBCDIC ?

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est utilisé par IBM :
    Abbreviation of Extended Binary-Coded Decimal Interchange Code. Pronounced eb-sih-dik, EBCDIC is an IBM code for representing characters as numbers. Although it is widely used on large IBM computers, most other computers, including PCs and Macintoshes, use ASCII codes.
    cf :
    P.S. Tu devrais fréquenter plus souvent le forum des ancêtres C , c'est souvent évoqué.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    cela marche en effet pour les caractères par contre j'ai un probleme etrange. j'ai realisé un programme a l'aide de la faq de developpez.com pour saisir un nombre entre 3 et 7
    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
     
    bool read_choice( int & N )
    {
        cout << "Entrez un chiffre entre 3 et 7 : " ; 
        while ( ! ( cin >> N ) || N < 3 || N > 7 )
        { 
            if ( cin.eof() )
            { 
                // ^D  (^Z sous windows); Fin du flux d'entree!
                return false; 
            }
            else if ( cin.fail() )
            { 
                cout << "Saisie incorrecte, recommencez : "; 
                cin.clear(); 
                cin.ignore( numeric_limits<streamsize>::max(), '\n' );
            }
            else
            {
                cout << "Le chiffre n'est pas entre 3 et 7, recommencez : ";
            }
        }
        return true; // succès
    }
     
    int main () 
    { 
        int choix;
        if ( read_choice( choix ) )
        {
            cout << "Vous avez choisi : " << choix << '\n';
        }
     
        return 0; 
    }
    rien d'original surtout en ayant lu la faq. le plus etrange est lorsque je replace le meme code dans un autre programme tout simple j'ai des erreurs de compilations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     warning C4003: not enough actual parameters for macro 'max'
     error C2589: '(' : illegal token on right side of '::'
     error C2143: syntax error : missing ')' before '::'
     syntax error : ')'
    tout cela sur la ligne avec le cin.ignore si quelqu'un pouvait m'eclairer

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu es pollué par des macros définies dans certains headers windows.
    Ajoute un #undef min et un #undef max juste après le dernier header windows, ça devrait aller mieux.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    en effet merci beaucoup pourquoi cette manipulation au fait?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut
    Juste histoire d'utiliser un std::set (ensemble) pour contrôler la saisie. Cela permet de traiter indifféremment des chiffres et des lettres avec des bornes complexes.
    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
    #include<set>
    using namespace std;
     
    char read_choice() 
    { 
    	static char const tab[] = "34568abcdxyz";
    	static const set<char> ensemble( tab, tab + sizeof tab );
    	for(;;)
    	{
    		cout << "Entrez un chiffre 3,4,5,6 ou 8 ou une lettre a,b,c,d,x,y ou z : " ; 
    		char c;
    		cin.clear();
    		cin.sync();
    		if( ! ( cin >> c ) )
    			throw "char read_choice() : cin";
    		if( ensemble.find( c ) != ensemble.end() )
    			return c;		
    	} 
    } 
     
    int main () 
    {
    	try
    	{
    		cout << "Saisie : " << read_choice() << endl; 
    	}
    	catch( char * const exception )
    	{
    		cout << "\nErreur saisie (" << exception << ")\n" << endl;
    	}
    }

  13. #13
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ajoute un #undef min et un #undef max juste après le dernier header windows, ça devrait aller mieux
    On peut aussi définir une macro NOMINMAX avant d'inclure windows.h. Enfin c'était juste pour pinailler.

    Juste histoire d'utiliser un std::set (ensemble) pour contrôler la saisie. Cela permet de traiter indifféremment des chiffres et des lettres avec des bornes complexes
    J'ai pas saisi l'interêt d'utiliser un set pour ça, par rapport à un string. Juste le temps de recherche plus faible ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    peut on aussi verifier la saisie d'un char avec l'exemple lu dans la faq qui servait a controler un entier? qui etait
    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
     
    bool read_choice( int & N ) 
    { 
        cout << "Entrez un chiffre entre 3 et 7 : " ; 
        while ( ! ( cin >> N ) || N < 3 || N > 7 ) 
        { 
            if ( cin.eof() ) 
            { 
                // ^D  (^Z sous windows); Fin du flux d'entree! 
                return false; 
            } 
            else if ( cin.fail() ) 
            { 
                cout << "Saisie incorrecte, recommencez : "; 
                cin.clear(); 
                cin.ignore( numeric_limits<streamsize>::max(), '\n' ); 
            } 
            else 
            { 
                cout << "Le chiffre n'est pas entre 3 et 7, recommencez : "; 
            } 
        } 
        return true; // succès 
    } 
     
    int main () 
    { 
        int choix; 
        if ( read_choice( choix ) ) 
        { 
            cout << "Vous avez choisi : " << choix << '\n'; 
        } 
     
        return 0; 
    }

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    probleme resolu

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

Discussions similaires

  1. [VBA]sortir d'un formulaire après controle saisie
    Par pageplant dans le forum IHM
    Réponses: 6
    Dernier message: 25/06/2008, 14h37
  2. controle saisie zone de text
    Par Emcy dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 01/03/2007, 14h50
  3. controle saisie mail dans fichier.php3
    Par metatron dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 13/09/2006, 14h22
  4. [RegEx] Controle saisie
    Par yoda7666 dans le forum Langage
    Réponses: 9
    Dernier message: 13/12/2005, 11h00
  5. [C#.NET] Controle Saisie cellule du Datagrid
    Par lefebvse dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/04/2005, 14h56

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