Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contôle de saisie en C

    30 juin 2022 à 22:08:08

    Coucou la famille!! svp j'ai besoin d'aide avec mon programme.  En fait ce que je veux c'est que le scanf prenne en compte que des nombres entiers non signés. Mais quand j'execute, avec un nombre negatif ou à virgule ça s'execute 
    #include <stdio.h>
     int Verifier(char n[])
    {
        int t=1,i;
        for(i=0;n[i]!='\0';i++)
        {
            if(((n[i]>='0')&&(n[i]<='9')))
            t=1;
            else
            t=-1;
        }
        return t;
    }
    void Saisir(char n[])
    {
        do
        {
        printf("Donner votre âge: \n");
        scanf("%s",n);
        }
        while(Verifier(n)==-1);
    }
    int main()
    {
        char ch[80];
        Saisir (ch);
        printf("Ah vous avez donc %s ans",ch);
    }
    
    

    :honte:
    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2022 à 22:20:50

      Salut,

      imagine que tu ais entré -19.21, maintenant exécute ta fonction verifier() sur une feuille. Quelle résultat donne-t-elle ?

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        1 juillet 2022 à 0:04:43

        Normalement la fonction devrait retourner -1

        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2022 à 0:21:07

          AzizCurtis1 a écrit:

          Normalement la fonction devrait retourner -1

          Hé non !

          i  n[i]   t (après le test)
          0   -    -1
          1   1     1
          2   9     1
          3   .    -1
          4   2     1
          5   1     1
          6   \0


          La fonction renvoie donc 1 , et je te soupçonne de ne pas avoir déroulé la fonction sur papier comme te le conseillait @drx


          Edit: orthographe

          -
          Edité par edgarjacobs 1 juillet 2022 à 0:30:56

          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2022 à 0:58:17

            AzizCurtis1 a écrit:

            Normalement la fonction devrait retourner -1


            Normalement, quand quelqu'un te demande de vérifier une fonction, il y a de fortes chances pour que celle-ci ne fasse pas ce que nous supposons que tu attends de cette fonction.

            Si on ne testait jamais rien sous prétexte que ça devrait normalement fonctionner, alors normalement, rien ne devrait fonctionner.

            Edit : un petit conseil : Quand tu fouilles dans tes poches et que tu finis par trouver ce que tu cherches, continues-tu à fouiller les poches restantes ?

            -
            Edité par drx 1 juillet 2022 à 1:05:19

            • Partager sur Facebook
            • Partager sur Twitter

            Bonhomme !! | Jeu de plateforme : Prototype.

              1 juillet 2022 à 1:44:01

              Fais ce que edgarjacobs a probablement fait ...
              Englobes ta boucle avec des { ... } (pour englober le if)
              et fais un printf de n[i] et de t à la fin )dans la boucle).

              for(int i=0; n[i] != '\0'; i++) {
                  if(n[i]>='0' && n[i]<='9')
                      t = 1;
                  else
                      t = -1;
                  printf("%c %d\n", n[i], t);
              }

              -
              Edité par PierrotLeFou 1 juillet 2022 à 1:49:45

              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                1 juillet 2022 à 5:42:19

                Oh desolé, vraiment je n'ai pas su comment dérouler c'est pourquoi j'ai parlé comme ça. Sorry, mais avec l'explication de @PierrotLefou j'ai compris mieux comment s'est fait le déroulement. Thanks!! Mais je me disais que comme dans ma boucle while, j'ai utilisés dans le code ascii que les termes allant de '0' à '9', le programme ne devrait pas retourner  un nombre négatif. puisque le terme '-' n'est pas dans ma boucle, du coût je me dis qu'il devrait retourner un "Donner votre âge" à chaque fois qu'il rencontre un '-' comme il le fait avec les autres termes comme '@', '*'...

                -
                Edité par L_oiseau_rouge 1 juillet 2022 à 6:17:50

                • Partager sur Facebook
                • Partager sur Twitter
                  1 juillet 2022 à 12:19:36

                  > du coût je me dis qu'il devrait retourner un "Donner votre âge" à chaque fois qu'il rencontre un '-' comme il le fait avec les autres termes comme '@', '*'...

                  Chaque fois qu'il rencontre autre chose qu'un chiffre. A moins qu'on ignore aussi les espaces (c'est sympa pour une saisie utilisateur).

                  Te reste plus qu'à le programmer, du coup, que je me dis.

                  -
                  Edité par michelbillaud 1 juillet 2022 à 12:19:59

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 juillet 2022 à 13:49:16

                    Puise que L_oiseau_rouge part sur une saisie récupérée sous forme de chaîne, on peut aussi utiliser scanf() avec la classe de caractères [0-9] pour n'obtenir que des chiffres.

                    La validation se fait alors :

                    • en vérifiant que scanf retourne bien 1 (si 0, cela signifie que le premier caractère n'est pas dans ceux permis)
                    • et si scanf() retourne 1, en vérifiant avec getchar() que le caractère suivant est bien un '\n' (sinon, cela signifie que la saisie est suivie de caractères qui ne sont pas dans ceux permis)

                    Cela donne ceci :

                    #include <stdio.h>
                      
                    void clear_stdin(void) {
                            int c;
                            while ((c = getchar()) != '\n' && c != EOF);
                    }
                    
                    void saisir_entier_naturel(char n[]) {
                            while (1) {
                                    if (scanf("%79[0-9]", n) == 1) {
                                            if (getchar() == '\n')
                                                    return;
                                            else
                                                    n[0] = '\0';
                                    }
                                    printf("Erreur de saisie\n");
                                    clear_stdin();
                            }
                    }
                    
                    int main(void) {
                            char ch[80] = { '\0' };
                            printf("Donner votre âge :\n");
                            saisir_entier_naturel(ch);
                            printf("Ah vous avez donc %s ans\n", ch);
                    
                            return 0;
                    }

                    J'ai ajouté un spécificateur de taille à scanf() pour ne pas dépasser la capacité du tableau de char et une fonction vidant le buffer de stdin. Compilé et exécuté :

                    $ gcc -Wall -Wextra 94577636.c
                    $ ./a.out 
                    Donner votre âge :
                    -12
                    Erreur de saisie
                    12.23
                    Erreur de saisie
                    12,45
                    Erreur de saisie
                    12
                    Ah vous avez donc 12 ans

                    -
                    Edité par Dlks 1 juillet 2022 à 14:17:48

                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 juillet 2022 à 18:23:19

                      En restant dans l'esprit du code de L_oiseau_rouge, il y a au minimum trois manières de coder la fonction de vérification (j'ai remplacé le return d'un entier par un booléen)

                      #include <stdbool.h>
                      
                      
                      bool IsUint_v1(char n[]) {
                      	for(; *n ; n++)
                      		if(*n<'0' || *n>'9')
                      			return(false);
                      		
                      	return(true);
                      }
                      
                      
                      bool IsUint_v2(char n[]) {
                      	for(int i=0 ; n[i] ; i++)
                      		if(n[i]<'0' || n[i]>'9')
                      			return(false);
                      	
                      	return(true);
                      }
                      
                      
                      bool IsUint_v3(char n[]) {
                      	bool ok=true;
                      	for(int i=0 ; ok && n[i] ; i++)
                      		if(n[i]<'0' || n[i]>'9')
                      			ok=false;
                      		
                      	return(ok);
                      }


                      Edit: et plutot que tester si le caractère est <'0' ou >'9', il suffit d'employer isdigit() avec le header ctype.h

                      -
                      Edité par edgarjacobs 1 juillet 2022 à 19:55:03

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 juillet 2022 à 20:30:51

                        Je mets mon code avec "%d" :

                        #include <stdio.h>
                        
                        int main(void)
                        {
                            int nombre;
                            int c;
                            printf("votre saisie : ");
                            while(scanf("%d", &nombre)!=1 || nombre<0 || (c=getchar())!='\n')
                            {
                                scanf("%*[^\n]");
                                getchar();
                                printf("vous devez saisir un nombre entier positif : ");
                            }
                            printf("%d\n", nombre);
                        
                            return 0;
                        }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juillet 2022 à 16:53:39

                          Chapeau rouloude, je n'ai pas réussi à le mettre en défaut ton code.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Contôle de saisie en C

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          • Editeur
                          • Markdown