C – getchar () dans une boucle?

Comment puis-je utiliser getchar () dans une boucle? Maintenant j’ai…

for (p=0; p<n_players; p++) { ... fflush(stdin); getchar(); } 

Mais ça ne marche pas … si n_players est 3, il exécute getchar 2 fois seulement à la fin …

 for (p=0; p<n_players; p++) { blank_start(); ascii_art_title(); printf("%s, tocca a te...\n",player_info[p].player_name); srand(time(NULL)); random_speed = MIN_WHEEL_SPEED + rand()%MAX_WHEEL_SPEED; move_wheel_pointer(random_speed, &pointer); if (player_points(&wheel[pointer]) == 0){ player_info[p].points = wheel[pointer]; } else { player_info[p].points = 0; } printf("\nGuadagni %d punti...\n",player_info[p].points); if (p<(n_players-1)) { printf("\nOra tocca a te, giocatore %d\n",(p+2)); } fflush(stdin); getchar(); } 

getchar saute la première boucle

Tout d’abord, le résultat du vidage d’un stream d’entrée n’est pas défini. Deuxièmement, “ne fonctionne pas” ne nous laisse pas beaucoup à faire.

Le comportement de fflush n’étant pas défini sur un stream d’entrée, le code tel que présenté est dépourvu de sens.

Cette boucle se produira effectivement 3 fois si n_players est égal à 3.

getchar() n’est pas une bonne option pour traiter les entrées de l’utilisateur. Ceci dit, si vous voulez toujours utiliser cette fonction, vous pouvez essayer de ne pas utiliser fflush et d’emstackr deux appels pour getchar :

Quelque chose comme ça:

 for (p=0; p 

Le problème avec getchar() est qu’il renvoie le prochain caractère disponible dans la mémoire tampon du clavier. Donc, si vous faites un c = getchar() et que l’utilisateur fait:

E '\ n'

(ce qui signifie qu'il / elle appuie sur le caractère E suivi de ENTER)

c conservera la valeur 'E' et le prochain appel à getchar() utilisera la touche ENTER ('\ n') enfoncée par l'utilisateur.

Comme vous pouvez le constater, il est donc difficile et difficile de contrôler correctement.

Si c'est pour tester du code, OK. S'il s'agit d'une application réelle, essayez d'utiliser des bibliothèques dépendantes de la plate-forme pour effectuer la saisie utilisateur (Win32 sous Windows, GTK sous Linux, ncurser sous Linux, etc.).

1] fflush sur le stream d’entrée est un comportement indéfini.

2] Votre boucle est en effet exécutée 3 fois. Le deuxième appel à getchar () utilisera la touche ENTER du stream qui y a été placé la première fois. Vous pensez donc qu’on ne l’appelle que deux fois.

En cascade, mettez un autre getchar () pour utiliser le \n . Cela va résoudre ton problème.