Partage
  • Partager sur Facebook
  • Partager sur Twitter

exercice de creation de mes propres variables

exercice du chapitre creer vos propres variables"

    3 janvier 2009 à 13:22:08

    voila le code
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Personne
    {
        char nom[100];
        char prenom[100];
        char adresse[1000];
        
        long age;
        int garcon;
    };
    
    //main:
    int main(int argc, char *argv[])
    {
    	long i=0;
    	struct Personne joueur[2];
    	do
    	{
    		printf("Votre nom?\n");
    		scanf("%s",joueur[i].nom);
    		printf("votre prenom?\n");
    		scanf("%s",joueur[i].prenom);
    		printf("ton adresse?\n");
    		scanf("%s",joueur[i].adresse);
    		printf("Quel est ton age?\n");
    		scanf("%ld",&joueur[i].age);
    		printf("est tu un garcon ou une fille? (1=garcon 0=fille)\n");
    		scanf("%ld",&joueur[i].garcon);
    
    		printf("Tu t'apelle %s %s\n", joueur[i].nom,joueur[i].prenom);
    		printf("Tu habite a  %s \n",joueur[i].adresse);
    		printf("tu a %ld ans \n", joueur[i].age);
    		if (joueur[i].garcon)
    		{
    			printf(" Tu est un garcon!\n");
    		}
    		else if (!joueur[i].garcon)
    		{
    			printf(" Tu est une fille!\n");
    		}
    		else 
    		{
    			printf(" Je ne connais pas ton sexe!\n\n");
    		}
    		i++;
    	}
    	while (i < 2);
    	system ("PAUSE");
    	return 0;
    }
    


    mon problème est:
    -quand je met un nom comme "younes mehdi" quand on me demande le nom, joueur[i].nom devient "younes" et joueur[i].prenom devient "mehdi"...alors que juste joueur[i].nom devrai contenir "younes mehdi"
    • Partager sur Facebook
    • Partager sur Twitter
      3 janvier 2009 à 14:00:45

      'jour :

      scanf("%ld",&joueur[i].garcon);
      

      joueur[i].garcon est de type int, donc pour l'afficher tu dois utilise "%d".

      ton problème viens des :
      scanf("%s", [...] );
      

      qui récupère tout les caractère jusqu'à tomber sur espace (ou '\n', \0' ...).
      je ne connais que très superficiellement les fonction d'entrée/sortie mais essaye de remplacer par ce code :
      gets(joueur[i].nom);
      


      bon courage.
      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2009 à 14:15:06

        dsl..
        ca ne marche pas beaucoup mieu...
        j'ai essaye de mettre Younes Mehdi sous joueur[i]prenom , ca a beugger
        • Partager sur Facebook
        • Partager sur Twitter
          3 janvier 2009 à 14:16:55

          /* ne jamais utiliser gets qui ne vérifie la taille de la chaine entrée */
          gets(joueur[i].nom);
          
          /* lui préferer fgets qui elle est sûre */
          fgets(joueur[i].nom, 100, stdin);
          


          + une fonction viderBuffeur()

          cf man fgets

          ;)
          • Partager sur Facebook
          • Partager sur Twitter
            3 janvier 2009 à 14:36:18

            printf("Votre nom?\n");
            fgets(joueur[i].nom, 100, stdin);
            printf("votre prenom?\n");
            fgets(joueur[i].prenom, 100, stdin);
            printf("ton adresse?\n");
            fgets(joueur[i].adresse, 100, stdin);
            


            Tu as fais comme ça ?
            • Partager sur Facebook
            • Partager sur Twitter
              3 janvier 2009 à 14:48:46

              Ba oui ...
              Après il suffit de changer le '\n' en '\0' mais ça a rien de bien compliqué.

              ;)
              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2009 à 15:12:12

                Citation : Antoxx

                Ba oui ...
                Après il suffit de changer le '\n' en '\0' mais ça a rien de bien compliqué.

                ;)



                ce n'est pas a toi que je pose ma question. ;)
                je me doute bien que tu sais comment on utilise cette fonction toi. :p
                • Partager sur Facebook
                • Partager sur Twitter
                  3 janvier 2009 à 16:37:18

                  Merci beaucoup les gars...ça marche impec'

                  Par contre quand ça passe à ma deuxième boucle ça saute l'étape dans la quelle je dois mettre mon nom.

                  tu t'appelle Louhichi Younes Mehdi
                  Tu habite a XX avenue des XXXXX
                  tu a 16 ans 
                   Tu es un garcon!
                  Votre nom?
                  Votre prenom?
                  -
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 janvier 2009 à 17:33:59

                    En fait scanf laisse dans le buffeur (c'est-à-dire stdin, le flux d'entrée standard) le '\n' qui correspond à la touche 'entrée' que tu fais pour entrer ton nom, prénom, etc.

                    Donc, quand tu arrives à la deuxieme boucle, il y a un '\n' en attente de lecture.
                    Tu executes fgets(joueur[i].nom, 100, stdin); . Cette fonction lit dans stdin 100 caractères jusqu'à ce qu'elle arrive sur un '\n'.
                    Et comme il reste un '\n' dans stdin, et ben elle le lit et n'a donc rien à te demander.

                    Pour remedier à cela, il faut soit enlever "les restes de scanf", soit tout simplement savoir se passer de scanf (ou bien voir annexe du cours de matéo), même pour demander des nombres !

                    ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 janvier 2009 à 17:49:32

                      Citation : heero78

                      je ne connais que très superficiellement les fonction d'entrée/sortie mais essaye de remplacer par ce code :

                      gets(joueur[i].nom);
                      



                      gets() est un bug (faille de sécurité impossible à corriger). Son usage est interdit dans les projets réels. Tu voulais peut être dire fgets() ?

                      http://www.siteduzero.com/tutoriel-3-3 [...] -a-fgets.html
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        3 janvier 2009 à 18:13:36

                        bonjours a tous

                        Si ça peut vous aidez il est possible de vider le buffer par exemple dans mon code il y'a un probléme:
                        int main()
                        {
                        
                           int a;
                           char choix;
                           printf("Entrer un nombre:\t");
                           scanf("%d",&a);
                           printf("\nEntrer O ou N:\t");
                           scanf("%c",&choix);
                           switch(choix)
                           {
                               case 'O': case 'o':
                                     printf("\nblablabla....");
                                     break;
                                case 'N': case 'n':
                                     printf("\nBLABLABLA....");
                                     break;
                                default:
                                     printf("\nil faut vider le buffer car quand vous avez taper le nombre %d \nle caractere de la touche entree est reste dans le buffer",a);
                                     break;
                           }
                        
                        
                            return 0;
                        }
                        

                        voici comment vider le buffer:
                        int main()
                        {
                        
                           int a;
                           char choix;
                           printf("Entrer un nombre:\t");
                           scanf("%d",&a);
                           printf("\nEntrer O ou N:\t");
                           fflush(stdin);//permet de vider le buffer
                           scanf("%c",&choix);
                           switch(choix)
                           {
                               case 'O': case 'o':
                                     printf("\nblablabla....");
                                     break;
                                case 'N': case 'n':
                                     printf("\nBLABLABLA....");
                                     break;
                                default:
                                     printf("\nil faut vider le buffer car\
                                     quand vous avez taper le nombre %d \n\
                                     le caractere de la touche entree est reste dans le buffer",a);
                                     break;
                           }
                        
                        
                            return 0;
                        }
                        


                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 janvier 2009 à 18:48:58

                          Citation : -ed-

                          gets() est un bug (faille de sécurité impossible à corriger). Son usage est interdit dans les projets réels. Tu voulais peut être dire fgets() ?

                          http://www.siteduzero.com/tutoriel-3-3 [...] -a-fgets.html



                          Non je n'ai pas fait d'erreur. ^^
                          Je parlais bien de gets(), mais comme je le dis, je n'utilise que très peu fonctions d'entrée/sortie de la bibliothèque standard, donc je ne connais pas toutes leur caractéristiques. (je commencer mon apprentissage du C qu'en octobre)
                          Mais effectivement, comme vous l'avez fait remarqué, gets() est une grosse faille de sécurité.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 janvier 2009 à 18:54:30

                            Citation : manrugby


                            voici comment vider le buffer:

                            fflush(stdin);//permet de vider le buffer
                            



                            Pas du tout. Le comportement de fflush() n'est défini que pour les flux sortants. Or, à l'évidence, stdin est un flux entrant.

                            Exemple typique de mauvaise information récurrente, car colportée par des profs qui se copient entre eux, des bouquins des sites web jamais corrigés...

                            Une solution correcte a déjà été donnée.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !

                            exercice de creation de mes propres variables

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown