Entrer une valeur ou appuyer sur Enter pour celle par defaut

bastet1978 Messages postés 54 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 4 décembre 2005 - 22 févr. 2005 à 16:20
bastet1978 Messages postés 54 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 4 décembre 2005 - 23 févr. 2005 à 10:30
Bonjour voila je dois recuperer des valeurs ou les definir si l'utilsateur tappes sur Enter.


J'ai 3 questions donc trois boucles demandant trois valeurs differentes.


j'ai commence par





do{

char
memstr[256];

printf("Dememorisation
number ---(default = 1000)--> ");

scanf("%c",
&memstr);

mem
= atoi(memstr);

if(mem
0){

mem
= 10000;

cout<<"\t\t\t\t\t\t"<<
mem<<endl;

}

if(mem
< 10){

cout<<"A
value less than 100 is not allowed"<<endl;

}


}while(mem
< 10 || mem > 10000);






Si j'appuie sur Enter tout va bien mais si j'entre une valeur, alors il lance les autres boucles.


Alors j'ais pense à recuperer la premiere touche avant de faire quelque
chose. De cette façon ca marche parfait mais la premiere touche n'est
pas ecrite. Si je veux entrer 100 il faudra que tappe deux fois sur 1
pour que le 1 s'affiche.





do{


cout<<"Dememorisation number ---(default = 10000)--> "<<endl;


cout<<"\t\t\t\t\t\t";


if(getch() == '\r'){ // recup la premiere touche


mem = 10000;


cout<<"\n\t\t\t\t\t\t"<<mem<<endl;


}else{


cin>>mem;


if(mem < 100){



cout<<"A value less than 10 is not allowed"<<endl;


}


}


}while(mem < 100 || mem > 10000);

2 réponses

yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
22 févr. 2005 à 17:01
La reponse est dans ce bouquin (tu le trouvera sur developpez.com)

Universite de la Mediterranee Faculte des Sciences de Luminy


Le langage C


Henri Garreta

Un petit extrait :
7.2.4 A propos de la fonction
scanf
et des lectures interactives


A propos de

sauter les blancs . Nous avons dit que les sp´ecifications qui constituent le format


peuvent ˆetre s´epar´ees entre elles par un ou plusieurs blancs, ce qui indique que les donn´ees `a lire correspondantes


peuvent
alors ˆetre s´epar´ees par un nombre quelconque de blancs.


Pour la fonction
scanf
, les blancs dans le format se traduisent donc par l’ordre  `a pr´esent, sautez tous


les caract`eres blancs qui se pr´esentent
. Or la seule mani`ere pour l’ordinateur de s’assurer qu’il a bien saut´e


tous les caract`eres blancs consiste `a lire (sans le consommer) le premier caract`ere non blanc qui les suit. Si la


lecture se fait dans un fichier, cela ne pose pas de probl`eme, les caract`eres `a lire existant tous d`es le d´epart.


Mais cela peut cr´eer des situations confuses dans le cas d’une lecture interactive mettant en oeuvre le clavier et


un op´erateur
vivant
. Exemple :


int x, y = 33;


...


printf("donne x : ");


scanf(" %d ", &x); /* aije... */


printf("donne y : ");


scanf("%d", &y);


printf("x %d, y %d\n", x, y);


Parce qu’on a ´ecrit, peut-ˆetre sans faire attention, des blancs
apr`es
le format
%d, le premier appel de scanf


ci-dessus signifie

lisez un entier et tous les blancs qui le suivent . L’op´erateur constatera avec ´etonnement que


pour que son premier nombre sont pris en compte il est oblig´e de composer le deuxi`eme ! Exemple de dialogue


(le signe
{
repr´esentant la frappe de la touche
 Entr´ee ) :


donne x : 11
{


{{


la machine ne r´eagit pas... ! ?


22
{ donne y : x 11, y 22


Notez que faire suivre le premier nombre d’un caract`ere non blanc conventionnel n’est pas une bonne solution


car, ce caract`ere n’´etant pas consomm´e, il fait ´echouer la lecture du second nombre :


donne x : 11
{ donne y : x 11, y 33


Le¸con `a retenir : dans le format de
scanf, les blancs ne sont pas de la d´ecoration, ils jouent un rˆole bien


pr´ecis.
0
bastet1978 Messages postés 54 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 4 décembre 2005
23 févr. 2005 à 10:30
Merci. je n'ai donc plus qu'à faire ma propre récuperation de valeur alors.

int cpt = 0;

printf("Dememorisation number ---(default = 10000)--> ");

do{

char memstr[6];

char buff;

buff = getchar();

if(buff == '\n'){ // si tappe sur Enter

printf("t'as tappe sur Enter\n");

printf("valeur de memstr: %d\n");

mem = atoi(memstr); // transforme memstr en chiffre

printf("valeur de mem: %d\n", mem);

if(mem == 0){ // si aucun chiffre

// alors 10000 par defaut

mem = 10000;

printf("%d \n", mem);

}else{

if(mem < 100){ // on teste si < 100


printf("\nA value less than 100 is not allowed\n");


printf("Dememorisation number ---(default = 10000)--> ");

// reinit

cpt = 0;


for(int i = 0; i < 6; i++){


memstr[i] = 0;

}

}

}

}else{ // on ajoute buff dns memstr

memstr[cpt] = buff;

cpt++;

}

}while(mem < 100 || mem > 10000);

Bha voila comme ça ça marche.
0
Rejoignez-nous