Newb - scanf et caractere

Newb - scanf et caractere - C++ - Programmation

Marsh Posté le 30-03-2003 à 17:17:35    

salut les mecs !
 
encore une fois je viens vous demander un peu d aide :D  
 
voila je voudrais faire un prog ki se relance ou qui quitte a la fin au choix de l utilisateur
 
voila ce que j ai fait :
 

Code :
  1. void main()
  2. {
  3. int choix;
  4. do
  5. {
  6.  // programme
  7.  do
  8.  {
  9.   fflush(stdin);
  10.   printf("\n\nVoulez-vous essayer une autre fois (0/1) ? \n" );
  11.   scanf("%d \n", &choix);
  12.  }while (choix != 0 &&  choix != 1);
  13.  system("cls" );
  14. }while (choix == 0);
  15. }


 
le gros probleme c est qu en faisant ca il me demande de faire le choix et la je dois rentrer 2 nombres (sans qu il me redemande) !
seul le premier est pris en compte :??:  
 
en revanche si j ajoute un mot dans le scanf
scanf ("votre choix : %d \n", &choix);
alors je ne dois plus rentrer qu un seul nombre mais il n est jamais bon donc le programme va reposer la question
 
de plus j aimerais remplacer 1 et 0 par O et N mais je ne sais pas comment faire :??:

Reply

Marsh Posté le 30-03-2003 à 17:17:35   

Reply

Marsh Posté le 30-03-2003 à 17:40:33    

Salut
Essaye plutôt ça :

Code :
  1. scanf("%d", &choix);


 
Pour utilise 'O' ou 'N' il suffit de changer choix de type, et le code :

Code :
  1. char choix;
  2.    
  3.      do
  4.      {
  5.        
  6.         // programme
  7.        
  8.         do
  9.         {
  10.            fflush(stdin);
  11.            printf("\n\nVoulez-vous essayer une autre fois (O/N) ? \n" );
  12.            scanf("%c", &choix);
  13.         }while (choix != 'O' &&  choix != 'N');
  14.         system("cls" );
  15.      }while (choix == 'N');

Reply

Marsh Posté le 30-03-2003 à 17:44:32    

Poireau a écrit :

fflush(stdin);


 :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-03-2003 à 17:51:26    

fflush(stdin);
 
Oui j'ai pas fait attention... Cette fonction n'est pas utile ici.
 
C'est pour forcer l'ecriture des donnees il me semble...
 
The  function  fflush  forces a write of all buffered data
for the given output or update  stream  via  the  stream's
underlying  write function. The open status of the stream
is unaffected.

Reply

Marsh Posté le 30-03-2003 à 17:55:41    

Poireau a écrit :

Salut
Essaye plutôt ça :

Code :
  1. scanf("%d", &choix);


 
Pour utilise 'O' ou 'N' il suffit de changer choix de type, et le code :

Code :
  1. char choix;
  2.    
  3.      do
  4.      {
  5.        
  6.         // programme
  7.        
  8.         do
  9.         {
  10.            fflush(stdin);
  11.            printf("\n\nVoulez-vous essayer une autre fois (O/N) ? \n" );
  12.            scanf("%c", &choix);
  13.         }while (choix != 'O' &&  choix != 'N');
  14.         system("cls" );
  15.      }while (choix == 'N');




 
OK merci pour les caracteres je savais pas qu il fallait mettre ' autour
 
pour le scanf il ne demande plus qu une fois c bon  :jap:  
ca a l air de fonctionner a peu pres sauf qu il pose deux fois la question au lieu d une :ouch:  

Reply

Marsh Posté le 30-03-2003 à 17:56:22    

Poireau > C'est pas qu'elle est pas utile, c'est qu'elle est indéfinie !
fflush(stdin) ne devrait jamais être utilisée, car fflush n'est censé être défini que sur les flux autorisant l'écriture (taz avait posté un lien à ce sujet, je sais plus trop ce que c'était).
Si tu veux vider le buffer du clavier, il vaut mieux lire tous les caractères un par un jusqu'a ce que tu tombes sur le caractère de fin de ligne :
 

Code :
  1. c = getchar();
  2. if (c != '\n')
  3.   while ((getchar()) !=  '\n'){};


Message édité par Harkonnen le 30-03-2003 à 17:56:48

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-03-2003 à 18:41:46    

http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
eh, les mecs, faites une petite recherche avant de poster, y a des tas de topics a propos de scanf etc. ca evite de se répéter et ça vous apprendra pas mal de truc.  :hello:

Reply

Marsh Posté le 30-03-2003 à 19:04:10    

++Taz a écrit :

http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
eh, les mecs, faites une petite recherche avant de poster, y a des tas de topics a propos de scanf etc. ca evite de se répéter et ça vous apprendra pas mal de truc.  :hello:  


 
desole mais j y comprend rien...

Reply

Marsh Posté le 30-03-2003 à 19:33:05    

bon en fait g remis le fflush(stdin) ca a l air de marcher
 
mais je sais pas du tt pkoi :heink:
 
 
en tt cas merci a vous tous :jap:


Message édité par TiTan91 le 30-03-2003 à 19:37:17
Reply

Marsh Posté le 30-03-2003 à 19:41:35    

on prends la peine de te répondre, prends la peine de nous lire

Reply

Marsh Posté le 30-03-2003 à 19:41:35   

Reply

Marsh Posté le 30-03-2003 à 19:58:21    

vi mais qd tu me renvoit vers un sujet ou ca parle de trucs que j ai jamais vu ca m avance pas bcp...

Reply

Marsh Posté le 30-03-2003 à 20:04:25    

j'ai donné ce lien à propos de fflush et ce topic parle exactement du mçme problème que celui que tu rencontre. Harko t'as tres bien répondu.
 
Apprends à lire

Reply

Marsh Posté le 30-03-2003 à 20:09:44    

titan91 a écrit :

bon en fait g remis le fflush(stdin) ca a l air de marcher
 
mais je sais pas du tt pkoi :heink:
 
 
en tt cas merci a vous tous :jap:  


 
 [:touki]  
 
Je confirme que ce ne sera pas grace au fflush :o


Message édité par Angel_Dooglas le 30-03-2003 à 20:10:18
Reply

Marsh Posté le 30-03-2003 à 20:56:37    

++Taz a écrit :

j'ai donné ce lien à propos de fflush et ce topic parle exactement du mçme problème que celui que tu rencontre. Harko t'as tres bien répondu.
 
Apprends à lire


 
ptet mais le fflush y en a besoin pour ke ca marche bien !
et c pas ce ke j avais compris !
 
qd au pkoi de la chose...

Reply

Marsh Posté le 30-03-2003 à 21:02:17    

non, y a pas besoin du fflush qui d'ailleur ne fais rien. si tu lisais nos reponses, ca fait un bon moment que t'aurais compris et que t'aurais arreté de nous les briser

Reply

Marsh Posté le 30-03-2003 à 21:24:31    

A ce que j'en ai compris, c'est pas tout à fait que le fflush ne fait rien ... C'est que dans ton cas tout à fait particulier de configuration d'OS, ca marche par miracle ... donc si jamais c'est pour un TP ou si tu passes ton prog à un pote, tu peux être certain à 99.9% que ca va foirer ...
 
Qu'est-ce que ca te coûte de remplacer ton fflush par des getchar ? Alors qu'au moins, tu seras sur que ton prog marchera partout ...


---------------
last.fm
Reply

Marsh Posté le 30-03-2003 à 21:27:12    

surtout que le getchar fonctionne

Reply

Marsh Posté le 30-03-2003 à 22:24:24    

mais c koi getchar ???
 
commetn je l'utilise pour ne pas avoir 2 fois le message ?


Message édité par TiTan91 le 30-03-2003 à 22:26:28
Reply

Marsh Posté le 30-03-2003 à 22:27:17    

titan91 a écrit :

mais c koi getchar ???
 
commetn je l'utilise pour ne pas avoir 2 fois le message ?


euh, t'as lu le code que je t'ai filé plus haut ? :heink:
tu remplaces le fflush(stdin) par ce code !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-03-2003 à 22:44:27    

RTFM

Reply

Marsh Posté le 30-03-2003 à 23:06:25    

Harkonnen a écrit :


euh, t'as lu le code que je t'ai filé plus haut ? :heink:
tu remplaces le fflush(stdin) par ce code !


 
mais c fo le definir comment ?


Message édité par TiTan91 le 30-03-2003 à 23:07:58
Reply

Marsh Posté le 30-03-2003 à 23:19:50    

Poireau a écrit :


C'est pour forcer l'ecriture des donnees il me semble...


 
pourquoi tu l'emploie pour la lecture alors ? [:ddr555]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-03-2003 à 23:20:02    

titan91 a écrit :


 
mais c fo le definir comment ?


 
essaie de deviner [:dawa]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-03-2003 à 23:30:41    

antp a écrit :


 
pourquoi tu l'emploie pour la lecture alors ? [:ddr555]


Moi j'ai juste recopier le code qu'il y avait à la base...
J'ai pas fait attention à ce fameux fflush.
 
Pour info titan91, getchar permet de recuperer le contenu du flux stdin caractère par caractère. Le but étant ici de le vider manuellement (en arrivant jusqu'au caractère '\n';) avec le code de Harkonnen.
getchar ne retourne pas un char, car la valeur spécifique EOF ne peut être codé dans un char.

Reply

Marsh Posté le 31-03-2003 à 19:50:47    

merci bcp les mecs !
 
mais c fini c rendu (c t un projet)
en tt cas ca marche sans pb sur les autres machines ou g teste  :D

Reply

Marsh Posté le 31-03-2003 à 22:02:04    

Poireau a écrit :


Moi j'ai juste recopier le code qu'il y avait à la base...
J'ai pas fait attention à ce fameux fflush.


 
Ouais je t'avais confondu avec l'auteur du topic :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 31-03-2003 à 22:14:12    

titan91 a écrit :

merci bcp les mecs !
 
mais c fini c rendu (c t un projet)
en tt cas ca marche sans pb sur les autres machines ou g teste  :D  


t'as utilisé fflush() ? :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 01-04-2003 à 20:04:29    

ouaip...

Reply

Marsh Posté le 01-04-2003 à 20:10:04    

juste une supposition. ton prof en corrigenat vas pas s'amuser à taper N(le nombre de programme)* les donénes. il fera un ficheir et redirigera. enjoy le fflush!

Reply

Marsh Posté le 01-04-2003 à 22:28:29    

++Taz a écrit :

juste une supposition. ton prof en corrigenat vas pas s'amuser à taper N(le nombre de programme)* les donénes. il fera un ficheir et redirigera. enjoy le fflush!


:lol:
 
[:xp1700]


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 00:02:27    

???
g pas capte ?
 
de tte facon en cours on nous a dit ke fflush ca vidait le clavier et on s en est servi pour une saisie securisee (nombres uniquement)
donc mon truc c juste une adaptation ;)

Reply

Marsh Posté le 02-04-2003 à 05:34:12    

tonc ours est mauvais et archi faut
 
 
tu commences à m'énerver à ne pas lire ce qu'on te donne!
 

Citation :

le comportement de fflush sur des flux entrants est absolument indéfini et ne fais absolument rien sur la plupart des systemes: et si ca fonctionne sur votre systeme, soyez sure que ça ne fonctionnera pas ailleurs. c'est le plus gros mythe qui existe en C. pour vider un flux, il faut lire à coup de fgetc .|
 
[...]
non. le fait est que fflush,ça n'a pas de sens sur un flux d'entrée. quand on dit fluser unf lux, on veut dire, finaliser les operations d'ecriturs bufferisés pour assurer la cohérence avec son disuqe dur par exemple. donc onv eut pas dire: coup de baguette magique, fais disparaitre le contenu du buffer. pourtant c'est ce qu'attende les gens quand ils font ça

Reply

Marsh Posté le 02-04-2003 à 06:04:36    

Il te dit qu'il ne capte pas, c'est pas la peine de lui repeter la meme chose :o
 

Citation :


14.4 Pourquoi ne jamais faire fflush(stdin) ?
La fonction fflush() a un comportement défini uniquement sur les flux ouverts en écriture tels que stdout. Il est possible que sur votre système, appliquer cette fonction à stdin soit possible, mais c'est alors une extension non standard. Le comportement est indéterminé, et imprévisible.
 
Il faut bien comprendre que stdin n'est pas forcément relié au clavier, mais peut être rattaché à un réseau, un fichier, etc.  


 
PS: en substance ca dit exactement la meme chose, hein :D
 
RePS:
Voila comment il faut faire (mais on te l'a deja dit plus haut  :whistle: , mais bon tant que j'y suis):
 
 

Citation :

14.5 Comment vider le buffer associé à stdin ?
Une bonne manière est de lire sur le flux tant qu'il n'est pas vide, avec les fonctions habituelles comme fgets() ou getchar(). Voici un exemple avec cette dernière :
 
    c = getchar();
    if (c != '\n';)
        while ( (getchar()) !=  '\n';) {
    };
     
 
Ce morceau de code permet de lire un caractère, et vide ce qui peut rester dans le buffer, notamment le '\n' final.


Message édité par Angel_Dooglas le 02-04-2003 à 06:08:13
Reply

Marsh Posté le 02-04-2003 à 06:07:26    

ben ca vient du lien que je lui ai donné. s'il capte pas, on y peut  rien, c'est qu'il a un problème de compréhension du français.

Reply

Marsh Posté le 02-04-2003 à 11:17:05    

Edit : nnaaaan ... J'préfère rien dire ... :D


Message édité par theshockwave le 02-04-2003 à 11:17:52

---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 14:49:41    

ok...
j comprend pas a 100% comment ca fonctionne mais j essayerais ca sur mon nouvo projet :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed