2010-01-06 20 views
0

Comment utiliser getchar() dans une boucle? Maintenant, j'ai ...C - getchar() dans une boucle?

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

Mais cela ne fonctionne 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 le premier boucle

+0

échangez les appels fflush (stdin) et getchar(). Oui, fflush (stdin) est techniquement indéfini, mais il fait la bonne chose à la fois dans ms-cl et gcc –

+0

ne fonctionne pas :( – genesisxyz

+1

Qu'est-ce qui ne fonctionne pas? Quel comportement voyez-vous et qu'attendez-vous? en gardant à l'esprit que getchar() ne traitera rien tant que vous n'aurez pas appuyé sur la touche Entrée Si n_players a 3, la boucle sera exécutée 2 fois – nos

Répondre

7

Tout d'abord, le résultat du vidage d'un flux d'entrée est indéfini. Deuxièmement, «ça ne marche pas» ne nous donne pas grand chose à faire. Le comportement de

+0

Je publie le code complet dans le 'for' – genesisxyz

+0

Plus vous êtes spécifique, plus il y a de gens sera incliné pour vous aider –

4

fflush n'est pas défini sur un flux d'entrée, donc le code présenté est dépourvu de sens.

Cette boucle sera en effet se produire 3 fois si n_players est 3.

2

getchar() est pas une bonne option pour traiter les entrées utilisateur. Cela dit, si vous voulez continuer à utiliser cette fonction, vous pouvez essayer de ne pas utiliser fflush et empiler deux appels à getchar:

Quelque chose comme ceci:

for (p=0; p<n_players; p++) { 
    ... 
    c = getchar(); // c will hold character read 
    getchar(); // will consume '\n' 
} 

La chose avec getchar() est que renvoie le caractère suivant disponible dans le tampon du clavier. Donc, si vous faites un c = getchar() et l'utilisateur fait:

E '\ n'

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

c tiendra la valeur 'E' et la prochaine appel au getchar() consommera le ENTRER ('\ n') pressé par l'utilisateur. Donc, comme vous pouvez le voir, c'est assez difficile et difficile à contrôler correctement.

Si c'est pour tester du code, OK. Si c'est pour une application réelle, essayez d'utiliser des bibliothèques dépendant de la plateforme pour faire des entrées utilisateur (Win32 sur Windows, GTK sous Linux, ncurser sur Linux, etc.)

+0

c = getchar(); getchar(); A la première boucle c'est ok ...mais à la seconde, je dois appuyer deux fois sur un bouton :( – genesisxyz

+0

gardez à l'esprit que, pour faire fonctionner getchar comme vous le souhaitez, vous devez appuyer sur une lettre avant d'appuyer sur enter. juste appuyer sur ENTER ne fonctionnera pas avec cette astuce. –

2

1] fflush sur le flux 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 clé ENTER du flux qui y a été ajouté lors de la première saisie. D'où vous pensez qu'il est appelé deux fois seulement.

Inshort, mettre un autre getchar() pour consommer le \n. Cela va résoudre ton problème.