Langage C probleme boucle

Fermé
jeremy08 - 19 nov. 2011 à 15:12
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 19 nov. 2011 à 17:54
Bonjour,
je dois faire un petit programme en devoir et le probleme c'est que ma boucle while ne fonctionne pas normalement quand je saisi un pays avec ses medailles le programme devrais me redemander " voulez vous resaisir un pays mais la non le programme s'arrete pourtant quand je met des system("pause") il me redemande bien de retaper un pays mais après apreil il s'arrete pourquoi ????? svp merci

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

   
typedef struct tpays
   {
         	   	char nom[30];
        	   	int bronze;
        	   	int argent;
        	   	int orr;
   };   


   
void saisie(int y, tpays tableau[100])
{
        
        printf("saisir le nom du pays\n");
        scanf("%s",&tableau[y].nom); 
        printf("saisir le nombre de medaille de bronze\n");
        scanf("%d",&tableau[y].bronze);  
        printf("saisir le nombre de medaille d'argent\n");
        scanf("%d",&tableau[y].argent);  
        printf("saisir le nombre de medaille d'or\n");
        scanf("%d",&tableau[y].orr);  
        
   
} 


/*
void affichage(int lim, tpays tableau[100])
{
     int i;
     
     for(i=1;i<lim;i++)
     {
      printf("%s - %d - %d - %d", tableau[i].nom, tableau[i].orr, tableau[i].argent, tableau[i].bronze);
      }
      
      
}




void participant(int i, int lim, tpays tableau[100])
{    

}







void tri()
{
}
*/ 
   
   
   
   
   
   main()
{
         tpays tableau [100];
         int lim,i;
         lim=1;
         i=1;
         
         
         
         char rep;
     
         printf("Voulez vous saisir un pays ? \n");
         scanf("%c",&rep);
         
          while ( rep=='o' && lim<=100)
           {
               
               saisie(i, tableau);
               printf("Voulez vous resaisir un pays ?");
               scanf("%c",&rep);
               i=i+1;
               lim=lim+1;   
               
              
             }
         
            
            
             
            
          //  affichage(lim, tableau);
         

}
   
   



A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
19 nov. 2011 à 15:20
Lorsque tu entres 'o' dans ton scanf tu appuies ensuite sur la touche entrée, donc en fait c'est comme si tu avais entré 'o\n' du coup ça se passe bien pour le premier tour de boucle car rep=='o' mais après tu vas avoir rep=='\n' et donc quitter ta boucle while.
Tu vas avoir le même problème si tu au lieu d'entrer 'o' tu tapes "oui", tu vas avoir 'o', puis 'u', puis 'i' puis '\n'
Pour s'en sortir tu pourrais faire un scanf("%s",char* ligne) et faire rep=ligne[0], tu auras alors uniquement le premier caractère de ta ligne, pas la suite...
0
merci pour ta réponse mais le %c c'est bien pour un seul caractère non donc il doit prendre que le o non ??
0
puis j'ai essayé un truc si je met rep='o'; quand je rentre directement dans ma boucle il devrait boucler alors non car rep n'est plus egale a /n mais a o non??
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 nov. 2011 à 15:49
merci pour ta réponse mais le %c c'est bien pour un seul caractère non donc il doit prendre que le o non ??
Oui. Mais le problème est que les autres caractères seront stockés dans le buffer clavier. Et c'est ce même buffer qu'interrogera les fonctions lecture (getchar, scanf, ...) au prochain tour.
Le mieux est de faire une fonction spécifique pour vider le buffer clavier. Mais, ici un simple getchar suffira (à condition de ne pas taper "oui" au lieu de "o").
Cdlt,
0
oui mais quand je supprime ma première question et que je remplace par directement rep='o'; donc apreès il devrait bien me reposer la question.....

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

   
typedef struct tpays
   {
         	   	char nom[30];
        	   	int bronze;
        	   	int argent;
        	   	int orr;
   };   


   
void saisie(int y, tpays tableau[100])
{
        
        printf("saisir le nom du pays\n");
        scanf("%s",&tableau[y].nom); 
        printf("saisir le nombre de medaille de bronze\n");
        scanf("%d",&tableau[y].bronze);  
        printf("saisir le nombre de medaille d'argent\n");
        scanf("%d",&tableau[y].argent);  
        printf("saisir le nombre de medaille d'or\n");
        scanf("%d",&tableau[y].orr);  
        
   
} 


/*
void affichage(int lim, tpays tableau[100])
{
     int i;
     
     for(i=1;i<lim;i++)
     {
      printf("%s - %d - %d - %d", tableau[i].nom, tableau[i].orr, tableau[i].argent, tableau[i].bronze);
      }
      
      
}




void participant(int i, int lim, tpays tableau[100])
{    

}







void tri()
{
}
*/ 
   
   
   
   
   
   main()
{
         tpays tableau [100];
         int lim,i;
         lim=1;
         i=1;
         
         
         
        char rep;
     
        rep='o';
         
          while (rep=='o' && lim<=100)
           {
                 
               saisie(i, tableau);
               printf("Voulez vous resaisir un pays ? \n");
               scanf("%c",&rep);
               i=i+1;
               lim=lim+1;   
               
              
            }
         
            
            
             
            
          //  affichage(lim, tableau);
         

}
   
   
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
19 nov. 2011 à 15:54
Essaye ce code :

while (1)
{
    printf("Entrez une ligne : ");
    scanf("%c",&c);
    printf("Valeur ASCII = %d\n",(int) c);
}

Une exécution possible est celle-ci :

Entrez un caractère : salut
Valeur ASCII = 115
Entrez un caractère : Valeur ASCII = 97
Entrez un caractère : Valeur ASCII = 108
Entrez un caractère : Valeur ASCII = 117
Entrez un caractère : Valeur ASCII = 116
Entrez un caractère : Valeur ASCII = 10
Entrez un caractère : 

Dans ce code je récupère bien un caractère à la fois, mais ma boucle va tous les récupérer les uns à la suite des autres, y compris le \n (ASCII=10)
Dans ton code c'est pareil, tu vas demander un caractère et tu vas bien récupérer 'o' la première fois, mais lors du deuxième scanf tu vas récupérer le reste de la ligne, par exemple le '\n' et c'est pour ça que ta boucle while s'interrompt. parce que rep!='o'
0