Nis Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 Hello tout le monde ... J'ai un ptit problème, qui me semble bien bête ... Mais je n'arrive pas à trouver une solution simple et propre ... Mon problème ... On affiche : Bonjour utilisateur, rentre un chiffre [2] : _ Si l'utilisateur tape la touche "Entrée", on utilise la valeur par défaut : 2. Si l'utilisateur tape un chiffre, il faut utiliser la valeur de ce chiffre ... Je ne sais pas trop comment m'y prendre pour "bien" le faire ... Dois-je utiliser pour ce faire un char ou un int ? Je pense qu'il faut utiliser cin.get(maVariable) pour arriver à prendre entrée comme un caractère. Si j'utilise cin >> maVariable, lorsque je tape entrée, il passe juste à la ligne en attendant un autre caractère ... Comment voir si l'utilisateur à appuyé sur Entrée ou bien un chiffre ? J'ai déjà essayé de détecter l'appui sur la touche entrée avec '\0x0D', '\CR', '\r', ... Ca ne fonctionne pas J'aimerais avoir vos avis :) Merci EDIT: J'ai cette solution actuellement : char nbJ; cout << "Rentre un chiffre [2] : "; cin.get(nbJ); //cout << "nbJ:" << (int)nbJ; // C'est surtout ceci que je n'aime pas ... if ((int)nbJ == 10) nbJ=2; else nbJ-=48; Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 Une solution simple : #include <stdio.h> int main (void) { char c; long ma_variable=0; ma_variable=( (c=getchar()) != '\n')?c-'0':2; printf ("ma_variable=%ld\n", ma_variable); return 0; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 tu va l'embrouiller la Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nis Posté(e) le 10 avril 2006 Auteur Partager Posté(e) le 10 avril 2006 tu va l'embrouiller la , je sais que je suis pas doué dans ce type de programmation mais tout d'même :) Le c-'0' m'a juste un peu fait peur au début ... Mais le principe reste le même :( J'aime pas trop le principe d'enlever 48 (ou '0'), je trouve pas ca très beau, très parlant ... Enfin, y'a ptetre pas moyen de passer outre J'aurais plus pensé à quelque chose du genre : cin.get(var); if (var == '\r') var=2; // c'est tout, si elle n'est pas égal à r, elle contient déjà le chiffre tapé. Merci pour ta réponse Théo Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 J'aime pas trop le principe d'enlever 48 (ou '0'), je trouve pas ca très beau, très parlant ... On s'y fait vite...Sinon atoi si tu as envie de charger ton programme pour rien. Merci pour ta réponse Théo No soucis Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 ATOI(3) Manuel du programmeur Linux ATOI(3)NOM atoi,atol, atoll, atoq - Conversion d'une chaA®ne en entier. SYNOPSIS #include <stdlib.h> int atoi (const char *nptr); long atol(const char *nptr); long long atoll(const char *nptr); long long atoq(const char *nptr); DESCRIPTION La fonction atoi() convertit le début de la chaîne pointée par nptr en entier de type int. Le résultat est identique A un appel strtol(nptr, (char **)NULL, 10); A la différence que atoi() ne détecte pas d'erreur. Les fonctions atol() et atoll() se comportent comme atoi(), sauf qu'elles convertissent la portion initiale de la chaîne dans leur type de retour long ou long long. atoq() est un nom obsolA"te pour atoll(). VALEUR RENVOYAE Le résultat de la conversion. CONFORMITA SVID 3, POSIX, BSD 4.3, ISO/IEC 9899. ISO/IEC 9899:1990 (C89) et POSIX.1 (édition 1996) incluent les fonctions atoi() et atol(). C99 ajoute la fonction atoll(). NOTES La fonction non-standard atoq() n'est pas présente dans la LibC 4.6.27 ni dans la GlibC 2, mais est présente dans LibC 5 et LibC 4.7 (bien que ce ne soit qu'une fonction inline dans <stdlib.h> jusqu'A LibC 5.4.44). La fonction atoll() est présente dans la GlibC 2 depuis 2.0.2, mais pas dans LibC 4 ou Libc4. VOIR AUSSI atof(3), strtod(3), strtol(3), strtoul(3) TRADUCTION Christophe Blaess, 1996-2003. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nis Posté(e) le 12 avril 2006 Auteur Partager Posté(e) le 12 avril 2006 Merci pour vos réponses Ce truc commence vraiment à m'énerver Problème 1 : atoi() Bon ... j'ai tenté d'utiliser atoi ... Je n'ai pas vraiment réussi ... Pour utiliser atoi(), je ne peux pas garder ma déclarion : char nbJ; mais je dois avoir ceci : // Je modifie le nom pour qu'on s'y retrouve mieux;) char * nbJstar Problème : cin.get() ne fonctionne pas avec un char * en argument. Il faut un char. Bon ... je n'utilise plus cin.get() alors, mais j'utilise quoi, pour que quand j'appuie sur enter, il prenne ça comme un caractère (et que dans ma console il ne passe pas à la ligne en attendant un "vrai" caractère, comme un chiffre dans mon cas ...) Quand j'utilise "cin >> nbJstar", le programme se bloque Peut-être scanf ? Mais bon c'est du c++, je ne sais pas si c'est très propre de commencer à mélanger les fonctions c et c++. Ce n'est qu'un détail ... mais bon ... Ca m'énerve que ça ne fonctionne pas ... Problème 2 : J'ai aussi un problème de buffer avec cin.get(var). (Pour ce problème je n'utilise plus nbJstar, mais nbJ) Par exemple : cout << "Entrez le nombre de joueurs (2-4) [2] : "; cin.get(nbJ); cin.get(nbJ); Si je rentre 9 et puis enter, il gardera le "caractère" enter dans nbJ ... Et j'aurai donc un nombre de joueurs égal à 2 (valeur par défaut, [2], quand on appuie sur enter, voir mon premier post), alors que j'en voulais 9. Je sais qu'il suffit de mettre un seul cin.get(nbJ) pour éviter le problème, mais je suis dans une autre situation ou je suis "obligé" de réutilisé le cin.get (en cas de nombre non compris entre 2 et 4, je redemande de rentrer un nombre). Je pourrais bien sur utiliser autre chose que cin.get(), mais j'aurais de nouveau le problème du enter ... (qui ne serait pas pris comme un caractère comme je l'ai déjà expliqué). J'ai tenté le fflush(stdin) mais ça ne fonctionne pas sur ce coup ... Encore un détail ... qui m'énerve ... Bref, beaucoup de prise de tête pour des détails Help Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 avril 2006 Partager Posté(e) le 12 avril 2006 Et ma solution, elle ne convient pas ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nis Posté(e) le 12 avril 2006 Auteur Partager Posté(e) le 12 avril 2006 En fait c'est en gros la même chose que moi mais écrit différemment. Donc oui ça convient :) Dans mon dernier post je parlais de atoi et d'un problème de buffer avec cin.get(). Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 avril 2006 Partager Posté(e) le 12 avril 2006 Oui, j'ai bien vu, mais je ne vois pas l'utilité de chercher une autre solution plus compliquée Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.