Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec des scanf en série

(j'ai pas trouver de titre digne de ce nom)

Sujet résolu
    14 juillet 2006 à 1:44:01

    Voila, voila....je tente de comprendre ce qui ne marche pas, mais je dois avouyer que je me retrouve devant une simple imcompréention, sans résolution...donc, si qeulqu'un pourrais juste m'enligner dans la bonne direction, je lui en serais reconnaissante.

    Je met donc le code suivant :

    Citation : Moi

    int main(int argc, char *argv[])
    {
    char nombredevie = 0;
    printf ("Il me reste combien de pts de Vie?\n\n");
    scanf ("%ld", &nombredevie);
    printf ("il me donc reste %ld pts de vie\n\n", nombredevie);
    system("PAUSE");
    char niveau = 0;
    printf ("Et quel Niveau suis-je?\n\n")
    scanf ("%ld", &niveau);
    printf ("Ha! J'ai donc %ld pts de vie et je suis niveau %ld\n\n", nombredevie, niveau);
    system ("pause");
    return 0;
    }



    Bon, il va de soit que tout ca, c'étais uniquement dans le but de "jouer" un peux avec le scanf, etc...mais, bon....apparament...j'ai "mal jouer" :p

    Quelqu'un pour me guider un p'tit peut, plz?

    --------------------------------------------------------------------------------

    Ha! Je précise que l'erreure semble ce situer ici :

    Citation : moi

    scanf ("%ld", &niveau);

    et que je me faire dire ceci :

    Citation : l'ied

    13 C:\Documents and Settings\Déèsse des Pleures\Mes documents\Test en C\main.c syntax error before "scanf"



    --------------------------------------------------------------------------------

    HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    J'ai trouver!!!!!!!!! :lol::):):):):D

    Le prob étais ici

    Citation : ma

    printf ("Et quel Niveau suis-je?\n\n")

    J'avais oublier les ";" héhé ^^

    merci quand meme a ceux qui on pris la peinne de me lire ;)

    Bon...les modos...faites ce que vous voulez de ce poste ;):p:lol:
    • Partager sur Facebook
    • Partager sur Twitter
      14 juillet 2006 à 2:25:49

      Juste pour info, si ton code est en C, tu es obligé de commencer ta fonction main() par la déclaration de toutes tes variables. Tu n'as pas le droit de mettre la ligne :

      char niveau = 0;

      ... à l'endroit où tu l'as écrite. Elle doit se placer tout en haut, juste en dessous (ou juste au dessus) de :

      char nombredevie = 0;

      Et tu te demandes peut-être pourquoi je prétend que c'est obligatoire en C alors que ton code compile et fonctionne... et bien, probablement parce que ton compilateur interprète ce code comme du C++ et non du C. Cela peut être du au paramétrage du compilateur ou, plus simplement, à l'extension de ton fichier source. S'il s'agit d'un .c, le compilateur doit normalement compiler en C. S'il s'agit d'un .cpp, alors il compile très certainement en C++ !

      En résumé, ton code fonctionne grâce au fait que le C++ a introduit cette possibilité et que ton code est interpreté comme du C++ mais si tu souhaites produire du code en C, tu dois respecter sa norme... et cette dernière impose que les déclarations se fassent en premier ! ;)
      • Partager sur Facebook
      • Partager sur Twitter
        14 juillet 2006 à 2:33:57

        Il me semble que la compilation réussit plutôt parce que c'est la norme C99 qui l'autorise. Mais c'est vrai que c'est plus propre de tout déclarer au début.

        Quant à l'erreur, c'est un simple oubli de point-virgule :
        printf ("Et quel Niveau suis-je?\n\n");/*Il manquait ici un point-virgule*/
        scanf ("%ld", &niveau);


        Par contre, dans la fonction scanf, tu écris "%ld", il attend donc une variable de type long et non pas char.
        • Partager sur Facebook
        • Partager sur Twitter
          14 juillet 2006 à 2:35:51

          :euh::o:lol:

          rien comprit! ^^

          Enfin, "rien"....facon de parler...tu peut redire ca d'une facon plus simple plz?

          Ensuite..vi, c'est suposer etre du C...mais, bon...je vien de commencer voila quelques heures et j'expérimente...donc....pitier...laisse moi un peux mon plaisir ^^

          Ensuite....heu...si de toute facon c'est possibile en C++ pourquoi pas le faire?

          Je veux dire....pourquoi aprendre les mathématique sans la notion du 0 si elle existe?....m'enfin....pour ce que j'en dit...
          • Partager sur Facebook
          • Partager sur Twitter
            14 juillet 2006 à 2:46:03

            Citation : Nienna

            Ensuite....heu...si de toute facon c'est possibile en C++ pourquoi pas le faire?


            On ne peut pas mélanger les deux car le langage C et C++ sont deux langages différents. C'est aussi moche que de placer des mots anglais (qui ne sont pas des anglicismes) dans une phrase en Français, si tu veux...

            Citation : Nienna

            rien comprit! ^^


            Qu'est-ce que tu n'as pas compris précisément ?
            • Partager sur Facebook
            • Partager sur Twitter
              14 juillet 2006 à 2:53:49

              Firya, en gros tu dit que je devrais marquer tout les variable les unes a la suite de l'autre..peut importe quand elle vont intervenir dans le programme en question?


              Timon

              Citation : Timon

              Par contre, dans la fonction scanf, tu écris "%ld", il attend donc une variable de type long et non pas char.



              Heu la je voie pas de quoi tu parle...."char" est pour désigners les nombre de -128 a 128....et %ld pour désigner les nombres entier...donc -_-'
              • Partager sur Facebook
              • Partager sur Twitter
                14 juillet 2006 à 3:01:28

                La seule chose qui est tolerée (et encore, j'évite de le faire quand je fait du code en C), c'est d'utiliser les // pour les commentaires. Ce type de commentaire n'est pourtant apparu qu'avec le C++ ! En C, tous les commentaires se font normalement entre des /* */

                Il ne faut pas te dire "si ca fonctionne, pourquoi ne pas le faire" ! Tu dois te dire que si tu apprend un language de programmation, il faut le faire de manière rigoureuse pour avoir un code aussi propre et authentique que possible. Et le mieux, c'est de respecter la norme.

                Prenons un exemple amusant... imaginons que dans 3 ans, tu es devenu un très bon programmeur en C et tu veux participer à un concours. Ben tu peux me croire, si tu apportes un code source où tu as fait tes déclarations de variables n'importe où (à la C++), on va gentillement te demander de revoir ton code et de repasser l'année prochaine parce que quand ils essayeront de compiler ton code source avec leur compilateur C, il va signaler des erreurs un peu partout ! ;)

                Sinon, pour ta question, oui. Je te confirme, c'est bien cela. Toute déclaration de variable doit être faite au début... pour l'affectation d'une valeur, ca peut se faire plus bas... donc, si je reprend ton code, tu pourrais très bien faire ca :

                int main(int argc, char *argv[])
                {
                  char nombredevie = 0;
                  char niveau;
                  printf ("Il me reste combien de pts de Vie?\n\n");
                  scanf ("%ld", &nombredevie);
                  printf ("il me donc reste %ld pts de vie\n\n", nombredevie);
                  system("PAUSE");
                  niveau = 0;
                  printf ("Et quel Niveau suis-je?\n\n")
                  scanf ("%ld", &niveau);
                  printf ("Ha! J'ai donc %ld pts de vie et je suis niveau %ld\n\n", nombredevie, niveau);
                  system ("pause");
                  return 0;
                }


                Comme tu le vois, j'ai déclaré la variable "niveau" au début et je lui ai affecté une valeur à l'endroit où tu l'avais déclaré. Comme ceci, pas de problème... c'est légal même en C ! :)

                Ensuite, Timon te disait qu'avec le code de formattage %ld, tu signales à scanf que la valeur qu'il va devoir interpreter est un entier long. Jusque la, pas de problème... sauf que tu stockes cette valeur dans un char. Si l'utilisateur entre effectivement un nombre entre -128 et 127... pas de problème. Que se passera-t-il s'il tape 1654278 ? ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  14 juillet 2006 à 3:20:50

                  Citation : Firya

                  Que se passera-t-il s'il tape 1654278 ? ;)



                  Bien....l'ordi vas donner une réponse, comprise entre 0 a 128 de toute facon :p

                  Et comme je connait pas moyen de bloquer l'utilisateur....-_-'

                  Et puis de toute facon....127, c'est peut etre la limite possible de pv aussi :p

                  Et puis...faut bien qu'il servent a quelque chose les "char"..na? :p

                  Mais bon....a par les %ld pour les nombre entier et le %lf pour les nombres décimal...je connait pas de %quelque chose particulierement fait puor les "char" :euh:

                  Enfin, quoi qu'il en soit...merci pour tes réponse claire ;)

                  --------------------------------------------------------------------------------

                  Ha! Une chose encore, quelqu'un saurais comment mettre Dev-C++ en mode C only?

                  Bon, j'imagine que la réponse est dans le tuto, vais regarder ca demain...mais, bon...je demande, au cas ou ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 juillet 2006 à 3:47:46

                    le char n'est rien de plus qu'un entier compris entre -128 et 127 (s'il est signed) et entre 0 et 255 s'il est unsigned !

                    Tu as déclaré des char donc selon l'implémentation que tu utilises, ce sera soit un unsigned, soit un signed. La plupart du temps, c'est le signed qui est utilisé par défaut.

                    Si l'utilisateur tape un nombre plus grand que la capacité du type de la variable dans laquelle tu veux stocker la valeur, il va se produire un overflow. En pratique, en mode "signed", cela se traduit ainsi :

                    - Si je tape 128, il va affecter -128.
                    - Si je tape 129, il va affecter -127.
                    - Si je tape -129, il va affecter 127.
                    - Si je tape -130, il va affecter 126.
                    - Etc...

                    Alors, oui... 127 peut être la limite de PVs, sans aucun doute... et tu peux parfaitement utiliser une variable de type char pour stocker cela mais le prob n'est pas là. Si tu veux limiter les PVs à un nombre précis, il te suffit de faire un controle de la saisie... donc, juste après ton scanf, tu peux faire un :

                    if (nombredevie > 127) nombredevie = 127;


                    Ton code revu dans cette logique donnerait ceci :

                    int main(int argc, char *argv[])
                    {
                      int nombredevie = 0;
                      int niveau = 0;
                      printf ("Il me reste combien de pts de Vie?\n\n");
                      scanf ("%d", &nombredevie);
                      if (nombredevie > 127) nombredevie = 127; // Pour que les PVs maxi soient de 127 !
                      printf ("il me donc reste %d pts de vie\n\n", nombredevie);
                      system("PAUSE");

                      printf ("Et quel Niveau suis-je?\n\n")
                      scanf ("%d", &niveau);
                      if (niveau < 1) niveau = 1; // Pour que le niveau min. soit 1 !
                      printf ("Ha! J'ai donc %d pts de vie et je suis niveau %d\n\n", nombredevie, niveau);
                      system ("pause");

                      return 0;
                    }


                    Sinon, pour répondre à ta question, voici différents types de données et le code de formattage qui leur correspond avec printf et scanf

                    - char (%c)
                    - int (%d)
                    - long (%ld)
                    - float (%f)
                    - double (%f)
                    - long double (%ld)

                    Et il faut savoir que le type char est essentiellement utilisé pour les variables qui sont censées représenter un caractère. On peut l'utiliser dans un souci d'économie de mémoire lorsqu'on ne doit stocker que des nombres compris dans les limites du type en question... mais avec toute la mémoire qu'on se paye dans nos PCs à l'heure actuelle, tu peux te permettre d'utiliser le type int lorsque tu dois traiter des nombres. Tu gagneras en lisibilité dans ton code car tu ne seras pas obligé de retenir que cette variable de type char est un caractère alors que cette autre variable de type char est un nombre... ^^

                    Je répond à ta dernière question et puis dodo... pour que Dev-C++ compile ton code source en C et non en C++, tu dois simplement sauvegarder ton fichier source avec une extension .c (et non .cpp) et le recompiler ! Bonne nuit :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 juillet 2006 à 3:57:52

                      o_O

                      *gloup*

                      Comme je disait, j'aime tes réponses....mais la....c'est trop...je vais mettre cette page en favoris et y revenir plus tard :p

                      Je savais meme pas que ca existait des %c, %d, if, etc....

                      Bon....j'admet alors que j'ai pas étuliser le %"quelque chose" correcte...j'aurais du mettre de %c (si j'ai bien comprit)....mais bon...j'ai fait ca alors que je n'en suis qu'as la page 4 du cours -_-,

                      Donc...si j'ai prise des %ld....c'est que pour moi y avais juste les %ld et %lf qui existait...donc, dit ainsi, j'ai prise ce que j'avais de mieux...puisque je ne voulais nulement parler de nombre décimaux...

                      Malgrer tout, je susi curieuse....

                      Citation : Firya

                      Sinon, pour répondre à ta question, voici différents types de données et le code de formattage qui leur correspond avec printf et scanf

                      code de formattage? Tu pourrais m,expliquer, plz? Car je suis plutot habituer a étuliser le mot "formattage" quand mon ordi est capout et que.....bref, enfin, tu voie :p;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 juillet 2006 à 4:13:14

                        Le formatage dans le cas d'un disque dur évoque le fait d'effacer les données, en effet. Mais "formater" ne veut pas dire "effacer"... ca veut dire "remettre en forme des données" ! Pour le disque dur, cela veut dire "préparer le disque dur à recevoir des données dessus".

                        Quand on parle de codes de formatage, on veut dire par là que ces codes (%d, %c, ...) vont dire à la fonction comment elle doit interpreter les données et/ou les mettre en forme à l'écran.

                        Un petit exemple vaut mieux qu'un long discours. Si tu fais :

                        int var = 65;
                        printf("La variable est : %d", var);


                        Tu dis que tu veux afficher un nombre entier stocké dans la variable "var"... et le résultat à l'écran sera :

                        La variable est : 65


                        Maintenant, si tu fais ceci :

                        int var = 65;
                        printf("La variable est : %c, var);   


                        Tu indiques que ce qui doit venir juste après les deux points, c'est un caractère. Du coup, printf va interpréter la valeur stockée dans "var" et va afficher le caractère correspondant à ce nombre dans la table des caractères. Le résultat à l'écran sera :

                        La variable est : A


                        Et... enfin... imaginons que tu tapes ceci :

                        int var = 65;
                        printf("La variable est : %f, var);   


                        Quel sera le résultat à l'écran vu que tu utilises le code de formattage d'un flottant ?

                        La variable est : 65.000000


                        J'espère ne pas me tromper vu l'heure tardive... mais cette fois-ci, j'y vais vraiment ! Bonne nuit ! :p
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 juillet 2006 à 4:17:58

                          merci pour tout

                          lool...je m'aprettais justement a te dire la même chose :p

                          Je suis entrain de tenter de comprendre quelque chose aux new fonction C que je voie...mais, zzzzzzzzzzzzzzz.....rien n'y fait...vais aller dodoter moi aussi

                          Allez, a+ :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 juillet 2006 à 9:01:06

                            Citation : Nienna

                            Voila, voila....je tente de comprendre ce qui ne marche pas, mais je dois avouyer que je me retrouve devant une simple imcompréention, sans résolution...donc, si qeulqu'un pourrais juste m'enligner dans la bonne direction, je lui en serais reconnaissante.


                            Ne pas utiliser scanf() du tout si on est pas un expert en la matière. Des alternatives fiables et relativement simples existent :

                            http://mapage.noos.fr/emdel/notes.htm#saisie
                            http://mapage.noos.fr/emdel/notes.htm#fichiers
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              14 juillet 2006 à 9:30:00

                              Pour l'instant, tu n'es pas obligé de mettre des %quelque chose...
                              Donc ton code pourrait simplement être cela : (en admettant que les vies maximales soient 100)

                              int main(int argc, char *argv[])
                              {
                                int nombredevie = 0, niveau = 0; // Déclaration des variables

                                printf ("Il me reste combien de pts de Vie?\n\n");
                                scanf ("%ld", &nombredevie);

                                if (nombredevie > 100) // S'il a entré un nombre plus grand que 100
                                {
                                nombredevie = 100; // On met les vies à 100
                                }

                                printf ("il me donc reste %ld pts de vie\n\n", nombredevie);
                                printf ("Et quel Niveau suis-je?\n\n")
                                scanf ("%ld", &niveau);

                                if (niveau < 1) // S'il entre un chiffre plus haut que 1
                                {
                                niveau = 1; // On met le niveau à 1
                                }

                                printf ("Ha! J'ai donc %ld pts de vie et je suis niveau %ld\n\n", nombredevie, niveau);

                                system ("PAUSE");
                                return EXIT_SUCCESS;
                              }


                              Plus tard dans le cours, tu devras apprendre tous les %quelque chose...

                              EDIT : Merci Kagura
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 juillet 2006 à 9:33:51

                                scanf ("%d", &niveau);


                                Il n'y a pas le "l" entre le "%" et le "d". :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 juillet 2006 à 12:44:47

                                  Citation : Kagura Jokunoichi

                                  scanf ("%d", &niveau);



                                  Il n'y a pas le "l" entre le "%" et le "d". :p


                                  Ca dépend du type de 'niveau'.

                                  int            : "%d"
                                  unsigned int  : "%u"
                                  long           : "%ld"
                                  unsigned long : "%lu"

                                  etc.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    15 juillet 2006 à 16:55:00

                                    Ah... désolé... j'avais pas vu... :euh:
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 juillet 2006 à 20:44:34

                                      heu....dites.....vous avez pas remarquer que le probleme de base a été auto résolue depuis le tout premier poste?...-_-'

                                      Faudrais voire a décrocher :p
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Probleme avec des scanf en série

                                      × 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