Validation de input char + int en même temps
Résolu/Fermé
Demonaz84
Messages postés
12
Date d'inscription
samedi 10 septembre 2016
Statut
Membre
Dernière intervention
5 décembre 2016
-
Modifié par Demonaz84 le 4/12/2016 à 04:34
Demonaz84 Messages postés 12 Date d'inscription samedi 10 septembre 2016 Statut Membre Dernière intervention 5 décembre 2016 - 5 déc. 2016 à 07:44
Demonaz84 Messages postés 12 Date d'inscription samedi 10 septembre 2016 Statut Membre Dernière intervention 5 décembre 2016 - 5 déc. 2016 à 07:44
A voir également:
- Validation de input char + int en même temps
- Ethernet n'a pas de configuration ip valide - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Blocage agriculteur carte en temps réel - Accueil - Transports & Cartes
- Indicateur d'activité snapchat combien de temps - Forum Snapchat
- Impossible d'utiliser ce numéro de téléphone pour la validation - Forum Gmail
2 réponses
yg_be
Messages postés
23316
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 novembre 2024
Ambassadeur
1 552
4 déc. 2016 à 12:11
4 déc. 2016 à 12:11
Rassure-toi : tu n'es sans doute pas le premier humain à confondre lettre et caractère, ni à confondre chiffre et nombre.
Ta demande serait plus claire si tu postais ton code.
L'utilisateur entre des caractères, et le programme reçoit des caractères.
Pour le programme, le caractère 1 et le caractère A sont des caractères et le nombre 1 est un nombre. Chaque variable a un type, qui détermine comment le programme interprète chaque variable.
Pour un humain, un caractère peut être une lettre, un chiffre, une ponctuation, ou autre chose. Remarque que ce ne sont pas des types de variables.
Le programme peut examiner chaque caractère pour déterminer s'il s'agit d'une lettre ou d'un chiffre.
Ta demande serait plus claire si tu postais ton code.
L'utilisateur entre des caractères, et le programme reçoit des caractères.
Pour le programme, le caractère 1 et le caractère A sont des caractères et le nombre 1 est un nombre. Chaque variable a un type, qui détermine comment le programme interprète chaque variable.
Pour un humain, un caractère peut être une lettre, un chiffre, une ponctuation, ou autre chose. Remarque que ce ne sont pas des types de variables.
Le programme peut examiner chaque caractère pour déterminer s'il s'agit d'une lettre ou d'un chiffre.
yg_be
Messages postés
23316
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 novembre 2024
Ambassadeur
1 552
Modifié par yg_be le 4/12/2016 à 15:53
Modifié par yg_be le 4/12/2016 à 15:53
Qu'est-ce qui t’empêche, après
Quand l'utilisateur n'entre pas de bonnes valeurs, le programme affiche malgré tout "Bonne valeur"? Ne serait-ce pas utile d'afficher cLettreUtilisateur et iChiffreUtilisateur ? Cela t'aiderait peut-être à comprendre ce qui se passe.
std::cin >> cLettreUtilisateur;, de tester immédiatement si cLettreUtilisateur est un "Q"?
Quand l'utilisateur n'entre pas de bonnes valeurs, le programme affiche malgré tout "Bonne valeur"? Ne serait-ce pas utile d'afficher cLettreUtilisateur et iChiffreUtilisateur ? Cela t'aiderait peut-être à comprendre ce qui se passe.
Demonaz84
Messages postés
12
Date d'inscription
samedi 10 septembre 2016
Statut
Membre
Dernière intervention
5 décembre 2016
4 déc. 2016 à 16:38
4 déc. 2016 à 16:38
aller, j'ai fait un petit programme comme tu l'as demandé, et ça fait la même chose, apres la première étape d'entrer et de vérifier les char, le stringstream entre des valeurs invisibles sans que je fasse quoique ce soit et ca affiche mauvaise valeur
copie colle mon programme et entre par exemple 'km', ca va valider k et m comme etant de bonnes lettres, puisi ensuite ca va meme pas te laisser le temps dentrer des chiffres ca va deja dire mauvaise valeur
copie colle mon programme et entre par exemple 'km', ca va valider k et m comme etant de bonnes lettres, puisi ensuite ca va meme pas te laisser le temps dentrer des chiffres ca va deja dire mauvaise valeur
#include <iostream> #include <string> #include <sstream> char ConvertirEnMajuscule(char cCaractere) { if (cCaractere >= 'a' && cCaractere <= 'z') { cCaractere = 'A' + cCaractere - 'a'; } return cCaractere; } int main() { setlocale(LC_ALL, ""); char cChar1; char cChar2; int iInt1; int iInt2; std::string sTentative; bool bSuccessChar = false; bool bSuccessInt = false; do { std::cout << "Veuillez entrer 2 lettres : "; std::cin >> cChar1 >> cChar2; if ((ConvertirEnMajuscule(cChar1) >= 'A' && ConvertirEnMajuscule(cChar1) <= 'Z') && (ConvertirEnMajuscule(cChar2) >= 'A' && ConvertirEnMajuscule(cChar2) <= 'Z')) { bSuccessChar = true; std::cout << "\ncChar1 : " << cChar1 << " cChar2 : " << cChar2 << "\n\n"; } else { std::cout << "\nInput invalide, doit être une lettre entre a et z\n\n"; system("pause"); bSuccessChar = false; } } while (bSuccessChar == false); do { std::cout << "\nVeuillez entrer 2 chiffres : "; std::getline(std::cin, sTentative); std::istringstream issTentative; issTentative.str(sTentative); issTentative >> iInt1 >> iInt2; if ((iInt1 >= 0 && iInt1 <= 9) && (iInt2 >= 0 && iInt2 <= 9)) { bSuccessInt = true; std::cout << "\niInt1 : " << iInt1 << " iInt2 : " << iInt2 << "\n\n"; } else { std::cout << "\nInput invalide, doit être un chiffre entre 0 et 9\n\n"; system("pause"); bSuccessInt = false; } } while (bSuccessInt == false); system("pause"); return 0; }
yg_be
Messages postés
23316
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 novembre 2024
1 552
4 déc. 2016 à 17:51
4 déc. 2016 à 17:51
Peux-tu être plus factuel, et décrire ce que le programme affiche à chaque étape quand tu testes? Je te suggère d'afficher à chaque fois ce que le programme reçoit après chaque cin.
Demonaz84
Messages postés
12
Date d'inscription
samedi 10 septembre 2016
Statut
Membre
Dernière intervention
5 décembre 2016
4 déc. 2016 à 19:31
4 déc. 2016 à 19:31
ok , je viens de rajouter des cout un peu partout pour tester à chaque étape, et voici ce que ça donne ( screenshot )
https://s3.postimg.org/rhql49083/test.jpg
il y a quelque chose qui ne fonctionne pas dans ma façon d'utiliser le stringstream, pour une raison que je cherche à comprendre, ça affiche le message de input invalide avant même que je n'aie pu entrer quoi que ce soit ,
également, la valeur de iInt1 et iInt2 ne sont pas transférées proprement, puisque le cout affiche une case de mémoire vide ( chiffre genre 650023981287 )
sauriez-vous comment régler tout ça ?
https://s3.postimg.org/rhql49083/test.jpg
il y a quelque chose qui ne fonctionne pas dans ma façon d'utiliser le stringstream, pour une raison que je cherche à comprendre, ça affiche le message de input invalide avant même que je n'aie pu entrer quoi que ce soit ,
également, la valeur de iInt1 et iInt2 ne sont pas transférées proprement, puisque le cout affiche une case de mémoire vide ( chiffre genre 650023981287 )
sauriez-vous comment régler tout ça ?
yg_be
Messages postés
23316
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 novembre 2024
1 552
4 déc. 2016 à 22:29
4 déc. 2016 à 22:29
Eh bien, je vois que le getline lit la suite de la ligne entrée précedement.
Je te suggère de mettre -1 dans int1 et int2 avant
Je te suggère de mettre -1 dans int1 et int2 avant
issTentative >> iInt1 >> iInt2;, cela te permettra de te rendre compte que
issTentative >> iInt1 >> iInt2;n'a pas réussi à trouver des nombres.
Demonaz84
Messages postés
12
Date d'inscription
samedi 10 septembre 2016
Statut
Membre
Dernière intervention
5 décembre 2016
5 déc. 2016 à 00:48
5 déc. 2016 à 00:48
ok, j'ai changé les int en char puisque venu le temps de lire 2 chiffres en même temps sans espace ça lisait juste 1 chiffre
j'ai fait roulé le déboggage en mode pas à pas et je me rend compte que ça passe une fois au complet mon 2ième do while avant de recommencer du début et là enfin il attend que je rentre le int1 et int2 et le mettre dans la string
pourquoi ça fait ça ? pourquoi comme vous dites le getline lit la ligne précédente et pourquoi ça lit le 2ième do while au complet une fois avant de retomber dedans et là enfin d'attendre que j'entre quelque chose ?
comment/où devrais-je mettre le getline pour éviter ce fiasco ?
voici le code modifié légèrement =
j'ai fait roulé le déboggage en mode pas à pas et je me rend compte que ça passe une fois au complet mon 2ième do while avant de recommencer du début et là enfin il attend que je rentre le int1 et int2 et le mettre dans la string
pourquoi ça fait ça ? pourquoi comme vous dites le getline lit la ligne précédente et pourquoi ça lit le 2ième do while au complet une fois avant de retomber dedans et là enfin d'attendre que j'entre quelque chose ?
comment/où devrais-je mettre le getline pour éviter ce fiasco ?
voici le code modifié légèrement =
#include <iostream> #include <string> #include <sstream> char ConvertirEnMajuscule(char cCaractere) { if (cCaractere >= 'a' && cCaractere <= 'z') { cCaractere = 'A' + cCaractere - 'a'; } return cCaractere; } int main() { setlocale(LC_ALL, ""); char cChar1; char cChar2; char cInt1 = -1 + '0'; char cInt2 = -1 + '0'; std::string sTentative; bool bSuccessChar = false; bool bSuccessInt = false; do { std::cout << "Veuillez entrer 2 lettres : "; std::cin >> cChar1 >> cChar2; std::cout << "\nTEST : " << cChar1 << " " << cChar2 << "\n"; if ((ConvertirEnMajuscule(cChar1) >= 'A' && ConvertirEnMajuscule(cChar1) <= 'Z') && (ConvertirEnMajuscule(cChar2) >= 'A' && ConvertirEnMajuscule(cChar2) <= 'Z')) { bSuccessChar = true; std::cout << "\ncChar1 : " << cChar1 << " cChar2 : " << cChar2 << "\n\n"; } else { std::cout << "\nTEST : " << cChar1 << " " << cChar2 << "\n"; std::cout << "\nInput invalide, doit être une lettre entre a et z\n\n"; system("pause"); bSuccessChar = false; } } while (bSuccessChar == false); std::cout << "\nTEST between both do whiles : " << cChar1 << " " << cChar2 << "\n"; do { std::cout << "\nVeuillez entrer 2 chiffres : "; std::cout << "\nTest 2 AVANT GETLINE " << cInt1 << " " << cInt2 << "\n"; std::getline(std::cin, sTentative); std::cout << "\nTest 2 APRES GETLINE " << cInt1 << " " << cInt2 << "\n"; std::istringstream issTentative; issTentative.str(sTentative); issTentative >> cInt1 >> cInt2; std::cout << "\nTest 2 APRES >> cInt1 >> cInt2 " << cInt1 << " " << cInt2 << "\n"; if (issTentative) { if ((cInt1 >= 0 && cInt1 <= 9) && (cInt2 >= 0 && cInt2 <= 9)) { bSuccessInt = true; std::cout << "\ncInt1 : " << cInt1 << " cInt2 : " << cInt2 << "\n\n"; } else { std::cout << "\nTest 2 " << cInt1 << " " << cInt2 << "\n"; std::cout << "\nInput invalide, doit être un chiffre entre 0 et 9\n\n"; system("pause"); bSuccessInt = false; } } } while (bSuccessInt == false); std::cout << "\nTest 2 après les 2 do whiles : " << cInt1 << " " << cInt2 << "\n"; system("pause"); return 0; }
4 déc. 2016 à 14:29
l'utilisateur doit faire une tentative dans le jeu, ce qui lui demande d'écrire une lettre et un chiffre en même temps ( donc un char et un int ) sous le format suivant : par exemple, F3 ou F 3).
la difficulté vient que ces 2 types de variables différents sont entrés en même temps.Cela occasionne une multitude de problèmes. Plein d'autres conditions viennent en considération et compliquer les choses, tout est nommé dans mon post initial ci dessus.
Vous sembler penser que je ne sais pas la différence entre un char et un int, j'ai donc dû très mal expliquer mon problème afin que l'on s'écarte à ce point de la nature de mon impasse héhéhé
mon code est trop énorme et divisé en plusieurs .cpp et headers et fonctions afin d'être vraiment postable ici, mais je crois avoir assez bien d'écrit mon problème pour ne pas que ça soit nécessaire de voir mon code.
désolé si mon explication n'était pas assez claire, en espérant que l'essence du problèeme soit maintenant plus évidente
Modifié par Demonaz84 le 4/12/2016 à 15:00
puisque les 2 sont entrés en même temps, l'utilisateur ne peut même pas , par exemple, faire Q pour quitter la partie, puisque le programme s'attends à avoir 2 cin , et non juste 1, donc il reste sur Q et attends un deuxième input.
je dois donc utiliser une fonction ( que j'ai mit en commentaire puisque ça ne fonctionne pas du tout, en fait ça empire dramatiquement mes problèmes ) pour valider l'input de l'utilisateur
idéalement, je dois faire un getline et mettre tout l'input de l'utilisateur dans un string , mais je ne le fais pas comme il faut, ça créer des nouveaux problèmes étranges, genre que en chargeant une nouvelle partie, ça affiche avant même que j'aie fait quoi que ce soit '' bonne valeur'' ou mauvaise valeur ... donc clairement je ne maitrise pas la validation multiconditionnelles de la string devant contenir une lettre + un chiffre seulement ( et les exceptions que j'ai nommé en exemple à plusieurs reprises
donc voici le bout de code en question dans lequel à la place du cin cLettre et cin iChiffre je dois faire une fonction pour valider tout ça =