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 :

Vérification de valeur entrée et valeur par défaut


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Par défaut Vérification de valeur entrée et valeur par défaut
    Salut tout le monde,

    En fait j'ai un problème avec mon programme, je demande un nombre et j'aimerais vérifier si c'est bien un nombre et non un caractère. J'aimerais aussi faire en sorte que si l'utilisateur n'entre rien et appui seulement sur la touche "entrer" un valeur par défaut soit attribuée.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Un petit getline(istream&, string&) (déclaré dans <string>) couplé à un istringstream (déclaré dans <sstream>) devraient faire l'affaire:
    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
    17
    18
    19
    20
    21
    22
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
     
    int read_int(int parDefaut)
    {
    	string line;
    	getline(cin, line);
    	if(line == "")
    		return parDefaut;
     
    	istringstream iss(line);
    	int ret = int();
    	iss >> ret;
    	if(iss.good()) {
    		//OK
    	} else {
    		//Pas OK: Lancer une exception?
    	}
    	return ret;
    }
    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.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Un petit getline(istream&, string&) (déclaré dans <string>) couplé à un istringstream (déclaré dans <sstream>) devraient faire l'affaire:
    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
    17
    18
    19
    20
    21
    22
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
     
    int read_int(int parDefaut)
    {
    	string line;
    	getline(cin, line);
    	if(line == "")
    		return parDefaut;
     
    	istringstream iss(line);
    	int ret = int();
    	iss >> ret;
    	if(iss.good()) {
    		//OK
    	} else {
    		//Pas OK: Lancer une exception?
    	}
    	return ret;
    }
    Ça c'est pas du c++
    C++ ->
    - Ne surout pas utiliser using namespace std, utiliser using std::string, using std::cout, ...
    - Getline devient cin.getline()
    - On init toujours une variable avec quelque chose ! -> string nom_var{""};
    - Pas de sstrem, utiliser std::to_string et pour le cast -> static_cast<string>(valeur);
    - #include <string> pas besoin ici, juste iostream suffit

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    autant de conseils mal venus.

    Ce code est au contraire très adapté.
    • cin.getline n'est pas aussi bon que tu le crois: notamment parce qu'il n'accepte pas d'argument de séparateur.
    • using namespace est un bon outil dans un .cpp (tant qu'on n'en a qu'un, et qu'on comprend où sont injectés les noms)
    • l'initialisation d'une string par son constructeur par défaut plutot que le constructeur par copie d'un char* non null est aussi une bonne chose.
    • un sstream est un autre moyen de préparer une conversion correcte. ici, on souhaite notamment (dé-)formater une chaine ou un nombre. De plus, le istringstream permettrait de vérifier que la ligne ne contient pas d'autres choses, ou de poursuivre la lecture.
    • le standard ne demande pas que <iostream> inclue <string>. <string> est requis, mais de nombreuses implémentation de <iostream> l'incluent déjà.


    Par contre, effectivement, j'aurai de prime abord opté pour int ret{}; plutot que int ret = int();

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par défaut
    Citation Envoyé par leternel Voir le message
    autant de conseils mal venus.

    Ce code est au contraire très adapté.
    • cin.getline n'est pas aussi bon que tu le crois: notamment parce qu'il n'accepte pas d'argument de séparateur.
    • using namespace est un bon outil dans un .cpp (tant qu'on n'en a qu'un, et qu'on comprend où sont injectés les noms)
    • l'initialisation d'une string par son constructeur par défaut plutot que le constructeur par copie d'un char* non null est aussi une bonne chose.
    • un sstream est un autre moyen de préparer une conversion correcte. ici, on souhaite notamment (dé-)formater une chaine ou un nombre. De plus, le istringstream permettrait de vérifier que la ligne ne contient pas d'autres choses, ou de poursuivre la lecture.
    • le standard ne demande pas que <iostream> inclue <string>. <string> est requis, mais de nombreuses implémentation de <iostream> l'incluent déjà.


    Par contre, effectivement, j'aurai de prime abord opté pour int ret{}; plutot que int ret = int();
    Using namespace std n'est pas un bon outils bon après je travail avec plusieurs namespace donc question d'habitude ?
    Pour l'init d'un string j'ai jamais entendu ça, je checkerai cppref
    Pour le sstrem j'avoue que je ne te suis pas un to_string utilise sstream donc bon
    Pour iostream c'est justement pour ça que string est inutile ici x)

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 471
    Par défaut
    Pour iostream c'est justement pour ça que string est inutile ici x)
    On utilise "std::string" donc on inclus <string>, qu'on n'en n'ai pas besoin pour l'implémentation Tartempion, cela n'a pas lieu d'influencer un code, qui doit compiler sur tous les environnements cibles.
    En plus, cela rend explicite les dépendances.

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Disixlis Voir le message
    Using namespace std n'est pas un bon outils bon après je travail avec plusieurs namespace donc question d'habitude ?
    Pour l'init d'un string j'ai jamais entendu ça, je checkerai cppref
    Pour le sstrem j'avoue que je ne te suis pas un to_string utilise sstream donc bon
    Pour iostream c'est justement pour ça que string est inutile ici x)
    Je suis d'accord pour le namespace std, mais pour mes namespaces, dans le cpp je ne me gène pas trop (cela dit, je ne fais pas beaucoup de nested namespaces)...
    Pour l'init d'un std::string, si t'as rien à mettre dedans, ben tu mets rien. C'est en ce sens que je ne suis pas fan des fonctions qui prennent des références en sortie (même si j'en utilise quand j'en ai besoin), et qui t'imposent donc d'avoir une variable qui aura une double initialisation (typiquement, un std::string).
    Pour le to_string, je ne vois pas pourquoi tu parles de ça, vu qu'on veut exactement l'inverse (extraire un int à partir de la chaîne).
    Et pour <iostream> et <string>, j'ai encore eu le soucis cette année avec de la compilation MSVC 10 (si si! ) et GCC 4.7.2 (si si! ), je ne sais plus lequel des 2 inclut string et pas l'autre, mais il est en tout cas plus portable d'inclure <string>.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Merci, leternel.
    Citation Envoyé par leternel Voir le message
    • cin.getline n'est pas aussi bon que tu le crois: notamment parce qu'il n'accepte pas d'argument de séparateur.
    Et surtout, à ma connaissance cin.getline() n'accepte que des buffers de char façon C, et seul getline(istream, string) accepte une string!

    Par contre, effectivement, j'aurai de prime abord opté pour int ret{}; plutot que int ret = int();
    Ça c'était un choix délibéré, par défaut je cherche la compatibilité maximale. Surtout pour un code pareil où je n'ai pas eu besoin d'aucune autre fonctionnalité du C++11.
    Alternativement, blame Microsoft: J'ai tellement passé de temps sur des vieux Visual Studio que j'ai pris le réflexe de supposer que mes interlocuteurs n'ont pas accès à C++11 jusqu'à preuve du contraire.
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Par défaut
    Désolé de ma réponse tardive, j'étais pas mal occupé. J'ai finalement trouvé une façon qui marche. Je ne pouvais pas utiliser de string, les profs ne veulent pas. Merci quand même.


    Voici les fonctions que j'ai utilisées
    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
     
     
    int ValiderEntree(char cEntree[], int iDefaut)
    {
       int iTouche;
     
    	// Si aucune touche n'est appuyée avant "Enter"
       if(cEntree[0]==NULL)
    	{
    		 // iTouche vaut la valeur par défaut
    		iTouche = iDefaut;
    	}
    	// Si une touche est appuyée
       else
       {
    		 // Vérifier si la touche est valide
          iTouche = LireEntier(cEntree);   // Fonction qui valide que l'entrée est bien un nombre et non une lettre
       }
    	return iTouche;
    }
     
    int LireEntier(char cEntree[])
    {
    	int iValeur;
     
    	// Les convertir en entier
    	iValeur = atoi(cEntree);
     
    	// Vérifier que la conversion s'est bien faite car elle retourne 0 si elle ne peut pas convertir en entier
    	// TANT QUE la conversion n'est pas correcte
    	while (iValeur == 0 && cEntree[0] != '0')
    	{
    		cout << "Vous devez entrer un nombre entre "<< iMIN_TAB << " et " << iMAX_TAB << " !" << endl;
     
    		// Relire tous les caractères
    		cin.getline(cEntree, sizeof(cEntree), '\n');
     
    		// Convertir
    		iValeur = atoi(cEntree);
    	}
     
    	return iValeur;
    }

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

Discussions similaires

  1. [Google Forms] Valeur d'un champ par défaut
    Par firebird13 dans le forum APIs Google
    Réponses: 0
    Dernier message: 19/01/2015, 16h19
  2. commande pour se renseginer sur la valeur d'un paramètre par défaut
    Par floyd973 dans le forum Programmation (La)TeX avancée
    Réponses: 2
    Dernier message: 07/09/2014, 18h54
  3. Image sur un input avec des valeurs qui se rajoutes par défaut X et Y
    Par yule dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/07/2012, 13h02
  4. Réponses: 2
    Dernier message: 05/12/2008, 12h06
  5. dernière valeur d'une liste par défaut
    Par faulk dans le forum Access
    Réponses: 2
    Dernier message: 11/07/2006, 12h34

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