Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probléme avec le c

Fonction lire

    12 août 2017 à 23:44:37

    Salut a tous, je viens de terminer le cour sur le c et pour m’entraîné j'ai fait un petit script qui me permet de calculé ma moyenne sauf que quand je créé une fonction pour lire l'input du clavier dans ma variable "char" le premier caractère et modifié 
    int main()
    {
        char phrase[6] ={0};
        note note[100] = {0};
        int continuer = 1, i = 0, correcte = 0;
    
        printf("calcule moyenne\n");
        while(continuer)
        {
            do
            {
            i++;
            printf("entre une note:");
            note[i].note = LireNombre();
            correcte = Verification_20(note[i].note);// si correct = 1 (nombre non valable) on fait recommencé
            if(correcte)
                i--;
            }while(correcte);
    
            do
            {
            printf("entre un coefficient:");
            note[i].coef = LireNombre();
            correcte = (Verification_20(note[i].coef));
            if(correcte)
                i--;
            }while(correcte);
            printf("'stop' pour stopper\n");
            continuer = Verification_stop();//vérifi si on tape stop ou STOP
        }
    
    
        return 0;
    }

    et mes fonctions

    void ViderBuffer()
    {
        int c = 0;
        while (c != '\0' && c != EOF)
        {
            c = getchar();
        }
    }
    
    int Lire(char *chaine, int longueur)
    {
        char *position_entree = NULL;
    
        if(fgets(chaine, longueur, stdin) != NULL);
        {
            position_entree = strchr(chaine, '\n');
            if(position_entree != NULL)
            {
                *position_entree = '\0';
            }
            return 1;
        }
        return 0;
    }
    
    long LireNombre()
    {
        char nombre_texte[100] = {0}; // 100 cases devraient suffire
    
        if (Lire(nombre_texte, 100))
        {
            // Si lecture du texte ok, convertir le nombre en long et le retourner
            return strtol(nombre_texte, NULL, 10);
        }
        else
        {
            return NULL;
        }
    }
    
    int Verification_20(long nombre)//on demande le nopbre a vérifier
    {
        if(nombre > 20 || nombre == NULL)
        {
            printf("erreure, nombre non valable\n");// on retourn 1 si c'est un nombre (car si pas nombre = NULL voir fonction LireNombre) ou si c'est un nombre supérieur a 20
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    int Verification_stop()
    {
        int i = 0, longueur = 0, valeur = NULL;
        char stop[] = "STOP";
        char chaine[100] = {0};
        *chaine = Lire(chaine, 100);
        longueur = strlen(chaine);//calcule la longueur de chaine
        while(i < longueur)//met lettre par lettre la chaine "chaine" en majuscule
        {
            chaine[i] = toupper(chaine[i]);
            i++;
        }
        i = 0;
        printf("%s", chaine);
        valeur = strcmp(chaine, stop);//compare "stop" avec "chaine"
        if(valeur == 1)
        {
            return 0;
        }
        return 1;
    }
    

    c'est la fonction "Lire" qui me pose probléme par exemple quand je tape "stop" avec la fonction lire cela me transforme ma premiére lettre.
     Merci d'avance pour votre aide

    -
    Edité par LéonGod 13 août 2017 à 0:55:09

    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2017 à 0:10:12

      enzobergamini : < Salut a tousse, >

      À tes souhaits.

      enzobergamini : < j'ai fait un petit script >

      Non, vu que le langage C n'est pas un langage de script.

      enzobergamini : < sauf que quand je créé une fonction pour lire l'input du clavier dans ma variable "char" le premier caractère et modifié >

      Dans la fonction Verification_stop, ligne 59. Tu modifies le premier caractère.

      *chaine = Lire(chaine, 100);
      ~~~~~~~~~

      Sinon au lieu de faire une capture statique, tu peux utiliser asciinema, c'est toujours plus agréable ! :)

      Par exemple : https://asciinema.org/a/112075

      -
      Edité par WhoiamWhoareyou 13 août 2017 à 0:12:48

      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2017 à 1:06:19

        Désolé pour les fautes d’orthographe et pour les fautes de terme (je suis nouveau mais merci pour l'info toujours bon a savoir).Mais du coup quesque je dois modifier?
        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2017 à 1:16:19

          Salut,

          J’ai pas lu tout le code, mais dans la fonction de vérification nombre est un long, il ne vaudra pas NULL. Pour saisir un entier, autant utiliser scanf. Par exemple.

          #include <stdio.h>
          
          int saisirEntier(void);
          
          int saisirEntier(void)
          {
              int nombre;
              while(scanf("%d", &nombre) < 1)
              {
                  viderBuffer();
                  printf("Erreur de saisie, vous devez saisir un entier. Recommencez : ");
              }
              viderBuffer();
              return nombre;
          }
          
          int main(void)
          {
              printf("%d", saisirEntier());
              return 0;
          }
          </stdio.h>

          -
          Edité par yo@n97one 13 août 2017 à 2:01:09

          • Partager sur Facebook
          • Partager sur Twitter
          Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
            13 août 2017 à 1:24:07

            Merci pour l'amélioration mais ce n'ai pas le probléme
            • Partager sur Facebook
            • Partager sur Twitter
              13 août 2017 à 1:59:27

              Il faut déjà corriger les avertissements et les erreurs. Par exemple, lireNombre doit renvoyer un long, NULL n’est pas un nombre. Compile avec l’option -Wall et corrige les avertissements.

              PS : tu peux rajouter -Werror pour transformer tous les avertissements en erreurs, et -Wfatal-errors pour arrêter la compilation dès la première erreur.

              • Partager sur Facebook
              • Partager sur Twitter
              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                13 août 2017 à 5:55:26

                Et c'est quoi note ? On ne peut pas compiler si on a pas tout et je ne crois pas que je vais commencer à réécrire ton code.

                :D

                • Partager sur Facebook
                • Partager sur Twitter
                  13 août 2017 à 7:39:15

                  LéonGod a écrit:

                  Mais du coup quesque je dois modifier?


                  Eh ben, tu dois modifier la fonction Lire ! Mais avant tout, tu dois comprendre l'erreur signalée par WhoamiWhoareyou.

                  Je n'ai pas regardé de trop près, mais il me semble que cette fonction admet pour arguments la chaîne à lire et sa taille, et qu'elle retourne 0 ou 1 selon que la lecture s'est mal ou bien passée. Donc lorsque tu appelles cette fonction, tu ne dois pas écrire :

                  *chaine = Lire(chaine, 100);

                  puisqu'alors tu affectes à la variable 'chaine' (en fait à son premier élément) la valeur de retour 0 ou 1. C'est l'erreur que t'as signalée WhoamiWhoareyou. Tu n'as pas remarqué que ça clochait ?

                  J'imagine que pour corriger ça, il faut faire quelque chose comme :

                  int ok_lecture;
                  ok_lecture = Lire(chaine, 100);
                  if (!ok_lecture)
                      { /* ici, traiter l'erreur de lecture */ }
                  /* Ici on poursuit : la lecture s'était bien passée */
                  

                  (J'ai lu ça rapidement, donc peut-être que ce n'est pas tout à fait ça. Mais le message que je veux faire passer, c'est de d'abord comprendre l'erreur, et rectifier ensuite.)

                  -
                  Edité par robun 13 août 2017 à 7:41:35

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 août 2017 à 20:47:30

                    Merci beaucoup pour vos retour je viens de comprendre mon erreurs (toute bête).Je modifiée ça Merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 août 2017 à 17:02:48

                      Bonjour tout le monde ! Je suis débutant en c , vraiment débutant , j'en suis qu'aux bases. C'est pas compliqué mais je suis planté sur la fonction void. Elle ne renvoie aucun résultat donc dans quelle cas l'utiliser. Merci d'avance pour votre aide .

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 août 2017 à 17:15:43

                        1) Ce sujet ne t'appartient pas, donc si tu as une question crée ton propre sujet !

                        2) Pour la réponse à ta question, tu peux utiliser une fonction void quand tu n'as pas besoin qu'elle renvoi de résultat. Par exemple une fonction qui fait une action d'affichage.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 août 2017 à 17:40:02

                          Désolé  j'me suis trompé on dirai! 

                          Merci pour la réponse ! Encore désolé

                          -
                          Edité par JeanJacquesBekouth 14 août 2017 à 17:42:48

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Probléme avec le c

                          × 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