2017-09-27 4 views
-2

hey j'ai eu un problème dans ce programme simple en c, qui exécute 5 fois le jeu "papier de pierre ou de ciseaux" et dit combien de victoires chaque joueur avait.La sortie fonctionne bien juste pour le d'abord boucle enter image description here, puis l'impression "Rock Paper Scissor" apparaît deux fois, toujours.sortie bizarre dans un simple pour le programme

#include<stdio.h> 
    int main(void) { 
     char player1,player2; 
     int i, vit1=0,vit2=0; 
     for(i=0;i<;i++){ 
      printf("rock paper or scissor\n"); 
      scanf("%c %c",&player1,&player2); 
      if(player1==player2) { 
       printf("tie\n"); 
      } 
      else { 
       if (player1=='r') { 
        if(player2=='s'){ 
         printf("vitoria player1\n"); //player1 wins in pt 
         vit1++; 
        } 
        else{ 
         printf("vitoria player2\n"); 
         vit2++; 
        } 
       } 
       if (player1=='s'){ 
        if(player2=='p'){ 
         printf("vitoria player1\n"); 
         vit1++; 
        } 
        else{ 
         printf("player 2 wins\n"); 
         vit2++; 
        } 
       } 
       if(player1=='p'){ 
        if(player2=='r'){ 
         printf("player 1 wins\n"); 
         vit1++; 
        } 
        else { 
         printf("player 2 wins\n"); 
         vit2++; 
        } 
       } 
      } 
     } 
     printf("num vitorias player 1 %d\n",vit1); //number of wins of each player 
     printf("num vitorias player 2 %d\n",vit2); 
     return 0; 
    } 
+3

Est-ce que cela compile même ?! 'for (i = 0; i <; i ++) {' devrait générer une erreur de compilation comme 'expression attendue avant ';' token' –

+0

ouais, je suis passé des valeurs d'index ici avant d'envoyer la question et fait cette erreur – ostnej

+0

@ostnej Vous pouvez modifier la question et corriger la faute de frappe de sorte que votre échantillon compile. –

Répondre

1

Si vous imprimez les valeurs de player1 et player2, vous verrez que la deuxième fois par player1 équivaut à une nouvelle ligne (0xa) pour que la boucle se répète. scanf est vraiment difficile à utiliser correctement. Ajouter un espace devant la 1ère% c

scanf(" %c %c",&player1,&player2); 

Qu'est-ce qui se passe est la nouvelle ligne pour permettre l'entrée à traiter se consomme sur le deuxième passage lorsque la deuxième ligne est entrée. Mettre l'espace devant le% c le fera consommer tout l'espace blanc avant que le personnage ne mange le retour à la ligne afin qu'il ne soit pas traité comme un personnage. A partir de la page de manuel scanf():

c Correspond à une séquence de caractères compteurs de largeur (1 par défaut); le prochain pointeur doit être un pointeur vers char, et il doit y avoir suffisamment de place pour tous les caractères (aucune terminaison NUL n'est ajoutée). Le saut habituel de l'espace blanc principal est supprimé. Pour passer d'abord l'espace blanc, utilisez un espace explicite dans le format.

Dans mes tests, je suis arrivé avec votre code de traitement d'entrée (les valeurs sont en hexadécimal):

r p 
72 70 
p r 
a 70 
20 72 

Maintenant, tout est éteint par un. Le 'a' est la nouvelle ligne le 70 est le p, l'espace apparaît sur la ligne suivante puis le r. Et la version fixe est:

r p 
72 70 
p r 
70 72 

La façon plus facile de le faire est d'obtenir une ligne de texte avec gets() puis utilisez sscanf() pour l'analyser.

+0

cela a fonctionné! merci beaucoup, je ne connaissais pas le problème de linebreak et de scanf ... J'ai déjà eu des problèmes similaires mais je n'ai jamais compris pourquoi ça ne fonctionnait pas – ostnej

-2

Si je me souviens d'une autre vie il ya .... Je pense que fprintf va effacer/vider après l'exécution.