Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] condition sur un char

    21 décembre 2005 à 14:41:25

    Bonjour, j'ai commencé à faire ma petite calculette,

    Mais comme j'avais lu dans un article que c'était une mauvaise facon d'utiliser scanf() pour récuperer (car on obtenait parfois des choses assez surnaturelles :-° ).

    Donc j'ai essayé avec une méthode trouvé sur internet :)

    Mais j'ai une erreur dans mon do ... while, car quand le fgets() prend mes chiffres dans un tableau (ou chaine de caractère, je sais pas trop :euh: ) Eh bien je ne peux pas les tester ( saisie > 0 )

    J'aimerais déjà qu'on m'explique un petit peux mes erreurs et comment je pourrais les corriger :)

    Voici mon code :
    #include <stdio.h>
    #include <stdlib.h>

    int main(void) {
        int new = 1;
        int ret;
        char temp[20];
        char saisie[20];
       
        while (new) {
            printf("----------------------------------------\n");
            printf("|         Calculette by dib258         |\n");
            printf("----------------------------------------\n");
            printf("\n1. Addition\n2. Soustraction\n3. Multiplication\n4. Division\n");
            printf("----------------------------------------\n\n");
            do {
               printf("Quel operation voulez vous effectuez ? ");
               fflush (stdout);
               fgets (saisie, sizeof saisie, stdin);
               ret = sscanf (saisie, "%[0-9-]s", temp);
            } while (ret != 1 && saisie > 0 && saisie <= 4);
            switch (saisie) {
                   case 1 :
                        printf("Ca marche 01");
                        break;
                   case 2 :
                        printf("Ca marche 02");
                        break;
                   case 3 :
                        printf("Ca marche 03");
                        break;
                   case 4 :
                        printf("Ca marche 04");
                        break;
            }
        }
        system("PAUSE");
        return 0;
    }



    Merci beaucoup d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2005 à 16:04:16

      Une fois que tu as ta chaîne dans ton buffer, tu peux utiliser sscanf() avec %d ou %i comme argument pour récupérer un int.

      int n;
      sscanf(saisie, "%i", &n);
      • Partager sur Facebook
      • Partager sur Twitter
        21 décembre 2005 à 18:41:59

        long valeur_menu;
        sscanf(saisie, "%ld", &valeur_menu);


        J'ai fait comme ceci :)

        Ca à l'air de marcher, est-ce bon ?

        je peux utiliser %ld pour passer en long ?

        Edit :

        1°) Merci beaucoup rz0 :D

        2°) Comment on remet une chaine de caractère à zéro ? (vidée quoi)

        char machaine[20];

        machaine = ""; ?
        • Partager sur Facebook
        • Partager sur Twitter
          21 décembre 2005 à 19:03:59

          Tu ne la remets pas à zéro, tu réécris dessus bêtement. Si tu veux faire qu'elle soit vide tu peux faire :
          strcpy(tachaine, "")
          ou plus simplement :
          *tachaine = '\0';

          ps : oui tu peux passer à long avec %ld, mais c'est généralement une mauvaise idée d'utiliser des longs si tu n'as pas de besoin particulier ; utilise int.
          • Partager sur Facebook
          • Partager sur Twitter
            21 décembre 2005 à 19:26:12

            Ah ok, c'est parce dans les cours de m@t (si j'ai bien tout comprit)

            Il préfaire utiliser les int comme des bool (en C++)

            et les long pour les chiffres normaux...

            C'est mauvais ?

            Edit : Comment on compare deux chaines de caractères ?

            Pour voir si :

            char machaine[20]; // qui contient "kikoolol"

            if (machaine == "kikoolol") { printf("ok"); }
            • Partager sur Facebook
            • Partager sur Twitter
              21 décembre 2005 à 19:39:56

              Mauvais, y a-t-il un mauvais C ? Sûrement mais c'est trop subjectif. Disons que tu ne trouveras personne qui fasse comme ça. ;) int est _le_ type entier par défaut et à vrai dire on l'utilise pour tout et rien et même abusivement là où d'autres seraient plus appropriés.
              En C, il n'y a pas de type booléen, la notion de vérité est de fausseté est une notion appliquée aux entiers, non pas aux booléens. De plus, on n'utilise pratiquement jamais des entiers que pour faire booléens en C, parce qu'en fait au lieu de stocker des relations (plus petit que, plus grand que, etc.) en C on a l'habitude de stocker des différences (a - b plutot que a < b).

              ps : strcoll(chaine1, chaine2) illustre très bien ce que je viens de dire : ça renverra la "différence" entre les deux chaînes ; si ta première chaine est plus grande (après, dans l'ordre du dictionnaire), ça renverra un nombre supérieur à 0, si elle est plus petite, un nombre inférieur à 0 et si elle est égale, 0.
              • Partager sur Facebook
              • Partager sur Twitter
                22 décembre 2005 à 0:43:51

                J'ai essayé comme ceci :


                char again;

                printf("\nVoulez vous rejouez ? (o/n) ");
                scanf("%s", &again);
                if (strcoll(again, "o")) {
                    new_game = 1;                   
                } else {
                    new_game = 0;   
                }


                Mais ca marche pas :/

                Ca doit encore être une connerie

                Puisque je connais pas encore bien les char, mais bon j'en ai besoin là :)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 décembre 2005 à 7:33:45

                  J'ai dit que ça renvoyait la différence donc si les deux sont égales, ça renverra 0.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 décembre 2005 à 8:31:41

                    oui bin si ca renvoie un zéro, j'ai quand meme un bug <_<


                    char again;

                    printf("\nVoulez vous rejouez ? (o/n) ");
                    scanf("%s", again); // je scan la lettre
                    if (strcoll(again, "o")) { // je test si la chaine est bien égal à o
                        new_game = 0;          // si cela renvoie autre chose que 0         
                    } else {
                        new_game = 1;          // si cela renvoie zéro, alors une nvl partie
                    }


                    Mais ce code ci me renvoie meme pas d'erreur, il fait bugger le programme lorsque je met un 'o' et puis [ENTER]

                    Il faut pas un '&' dans le scanf ? et c'est bon '%s' ?
                    Pour la déclaration d'un char simple il ne faut pas faire char machaine[1]; ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 décembre 2005 à 8:38:36

                      Un char est _un_ caractère, les chaînes sont des tableaux de caractères.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 décembre 2005 à 8:42:48

                        Ah, et c'est pas la meme chose pour les tester alors ? :euh:

                        Tu peux juste me dire ce que je dois mettre dans la condition pour que ca marche, ca m'aiderai vraiment ^^

                        :D (En tout cas merci de preter ton savoir pour mon apprentissage)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 décembre 2005 à 8:53:48

                          Si tu ne veux qu'un seul caractère, c'est bien char mais dans le scanf c'est %c et pas %s et tant qu'à faire tu peux utiliser getchar() et pour comparer c'est bêtement tonchar == 'o' (quotes simples pour les char).
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 décembre 2005 à 8:55:25

                            Je suis également intéressé par la question de dib ;)
                            Je me demandais comment faire une condition lorsqu'on pose une question à l'utilisateur et qu'il doit répondre "oui" ou "non" :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 décembre 2005 à 10:17:14

                              Vous pouvez utiliser par exempme une fonction que j'ai codée et balancé sur le forum ya un certain temps puisque vous ne connaissez pas encore les pointeurs.
                              char *
                              agets(void)
                              {
                                      char *s = NULL, *p;
                                      size_t n = 1;

                                      do {
                                              p = realloc(s, n += 80);
                                              if (p == NULL)
                                                      goto error;
                                              s = p;
                                              p = s + n - 81;

                                              if (fgets(p, 81, stdin) == NULL)
                                                      goto error;
                                      } while (p[strlen(p) - 1] != '\n');

                                      return s;

                              error:
                                      free(s);
                                      return NULL;
                              }


                              et pour l'utiliser c'est à peu près ça :
                              - on l'appelle, elle renvoie un char *
                              - et quand on a finit avec le char * faut le libérer avec free() (sinon, c'est un memory leak)

                              int
                              main(void)
                              {
                                      char *s;
                                      s = agets();
                                      if (s == NULL)
                                              /* erreur ici : n'a pas pu obtenir de la mémoire */

                                      if (strcoll(s, "oui") == 0)
                                              printf("Tu es d'accord !\n");
                                      free(s);
                                      return 0;
                              }

                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 décembre 2005 à 11:06:19

                                Merci pour ton aide :)

                                J'ai enfin réussi à finir le TP de m@t

                                (J'ai mit 1h à le faire et 1jours à écrire les 4 dernières lignes pour demander si il veut recommencer Image utilisateur :p)

                                Edit : Par contre, lorsque je tape sur le [ENTER] après avoir introduit mon caractère, il reload le jeux, il lorsque le jeux s'arrete pour la première fois et attent la réponse de l'utilisateur, il fait comme si l'utilisateur avait appuyer sur [ENTER] donc il redemande une deuxième fois...

                                Comment remédier à ceci ?
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [C] condition sur un char

                                × 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