IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Empecher la saisie d'un réel


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut Empecher la saisie d'un réel
    Bonjour je veux faire une table de multiplication mais je veux empecher la saisie d'un réel ou d'un entier suivi de caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <stdio.h>
     
    int main ()
    {
        int entier,i,ok;
     
        printf("Entrer un entier positif : ");
        ok=scanf("%d",&entier);
        while (getchar()!='\n');
     
        if(entier>=0 && ok!=0)
        {
            for(i=1;i<=10;i++)
                printf("%d x %d = %d\n",entier,i,entier*i);
        }
        if(ok==0)
            printf("Le nombre saisi n'est pas un entier.");
        if(entier<0)
            printf("Le nombre saisi est negatif");
     
        return 0;
    }

  2. #2
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    J'ai réussi à bidouiller qqc, dites moi si je peux l'améliorer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
     
    int main ()
    {
        int entier,i,ok;
     
        char c=0;
     
        printf("Entrer un entier positif : ");
        ok=scanf("%d",&entier);
        if(getchar()!='\n')
            c=getchar();
     
        if(entier>=0 && ok==1 && c==0)
        {
            for(i=1;i<=10;i++)
                printf("%d x %d = %d\n",entier,i,entier*i);
        }
        if(c!=0)
            printf("Le nombre saisi n'est pas un entier ou contient des caracteres.\n");
        else if(ok==0)
            printf("Le nombre saisi n'est pas un entier.\n");
        if(entier<0)
            printf("Le nombre saisi est negatif");
     
        return 0;
    }

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Traditionnellement, tu pourrais faire une boucle qui se poursuit jusqu'à une saisie conforme ou jusqu'à ce que scanf() retourne une valeur négative.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    J'ai réussi à bidouiller qqc, dites moi si je peux l'améliorer :
    Bonjour

    Bien sûr

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    int saisie()
    {
        char buff[1024];
        int n;
     
        while (1)
        {
            fputs("Entrer un entier positif : ", stdout);
            fflush(stdout);
            fgets(buf, 1024, stdin);
            if (sscanf(buf, "%d", &n) == 0)
            {
                printf("La valeur (%s] n'est pas un nombre entier - Recommencez\n", buf);
                continue;
            }
            if (n < 0)
            {
                printf("Le nombre (%d] est négatif - Recommencez\n", n);
                continue;
            }
            break;
        }
        return n;
    }
     
    int main ()
    {
        int entier, i;
        entier=saisie();
        for(i=1;i<=10;i++)
            printf("%d x %d = %d\n",entier,i,entier*i);
        }
        return 0;
    }

    Toujours essayer de séparer les groupes d'actions. Tu as d'une part une action dédiée à la saisie (et au contrôle de celle-ci) et d'autre part une action dédiée au traitement de ce qui a été saisi. Et utiliser fgets() te permet de ne pas laisser des saletés dans stdin ce qui t'évite ce getchar() à répétition (sauf si un abruti s'amuse à rentrer plus de 1024 caractères mais je pense que c'est assez rare pour ne pas avoir à blinder aussi contre ce genre de truc...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Bonjour SVear, je te remercie pour ta réponse, effectivement l'utilisation de fgets est très intéressante. Par contre j'évite d'utiliser les break et les continue pour que le code soit plus lisible. Mais dans ton code tu ne vérifies pas si un utilisateur tape un chiffre suivi d'un caractère par exemple.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    Par contre j'évite d'utiliser les break et les continue pour que le code soit plus lisible.
    Tu as bien tort. Certains profs coincéspuristes n'aiment pas en effet les break et les continue parce que cela nuit à l'harmonie de l'univers (ou bien ça dérange les voix qu'ils ont dans leur tête, j'en sais rien) mais tu verras que parfois, un bon break/continue au bon endroit rend justement un code bien plus lisible que tout autre chose...

    Citation Envoyé par benjamin_malaussene Voir le message
    Mais dans ton code tu ne vérifies pas si un utilisateur tape un chiffre suivi d'un caractère par exemple.
    Exact - J'avais tapé vite fait

    Code rectifié (et tu verras, j'ai enlevé le break pour te faire plaisir
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
    #include <string.h>
    int saisie()
    {
        char buf[1024];
        char other[1024];
        int n;
        char *c;
     
        while (1)
        {
            fputs("Entrer un entier positif : ", stdout);
            fflush(stdout);
            fgets(buf, 1024, stdin);
            if (c=strchr(buf, '\n')) *c='\0';
     
            if (sscanf(buf, "%d", &n) == 0 || (sprintf(other, "%d", n), strcmp(buf, other) != 0))
            {
                printf("La valeur [%s] n'est pas un nombre entier - Recommencez\n", buf);
                continue;
            }
            if (n < 0)
            {
                printf("Le nombre [%d] est négatif - Recommencez\n", n);
                continue;
            }
            return n;
        }
    }
     
    int main ()
    {
        int entier, i;
        entier=saisie();
        for(i=1;i<=10;i++)
            printf("%d x %d = %d\n",entier,i,entier*i);
        return 0;
    }

    C'est ça aussi l'avantage de découper: quand une partie de l'action est incomplète, elle est facile à rectifier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Salut svear, merci pour ta réponse, c'est super car tu me fais découvrir des fonctions sur les chaines de caractères que je ne connaissais pas. Par contre est ce que tu pourrais m'expliquer cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (c=strchr(buf, '\n')) *c='\0';
    Merci beaucoup

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça équivaut à ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c = strchr(buf, '\n')
    if(c)
    	*c='\0';
    En gros, ça cherche le \n saisi par fgets(), et si ça le trouve, ça le remplace par un caractère nul, tronquant la chaîne à cet endroit-là.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benjamin_malaussene Voir le message
    Par contre est ce que tu pourrais m'expliquer cette ligne ?
    Citation Envoyé par Médinoc Voir le message
    En gros, ça cherche le \n saisi par fgets(), et si ça le trouve, ça le remplace par un caractère nul, tronquant la chaîne à cet endroit-là.
    Hé oui. la seule chose qui fasse d'une chaine une "chaine" c'est la présence du '\0'. Par exemple char toto[10]={'a', 'b', 'c', 'd'} et tu as un simple tableau de 10 caractères (dont 4 initialisés) mais rajoute toto[4]='\0' et tu pourras alors traiter toto comme une chaine (le passer à strlen(), printf(), strcpy(), etc). En effet, toutes ces fonctions ne font que partir du début et balayer jusqu'à trouver un '\0'.

    Donc placer un '\0' au bon endroit d'un tableau te permet de créer une chaine qui partira du début du tableau et où toutes les fonctions qui l'utiliseront s'arrêteront au premier '\0'.

    Donc ici, mon but était de tronquer la chaine saisie au premier '\n' (parce que fgets() récupère tout y compris le '\n' représentant le <return> sur lequel tu appuies pour valider ta saisie). Je commence par le chercher et si je le trouve, je le remplace par un '\0'.
    J'aurais pu aussi partir du principe qu'il y était forcément (puisqu'on appuie toujours sur "<return>") et que sa position était toujours le dernier caractère de la chaine (puisque le "<return>" est la dernière chose reçue par fgets()) et écrire alors buf[strlen(buf)-1]='\0' mais il y a toujours le risque du lapin crétin qui saisisse 5000 caractères. Dans ce cas, fgets n'en récupérant que 1023 (attention il en garde un pour y mettre le '\0' car il te garantit que tu recevras une chaine) ne récupère pas de '\n'. D'où mon test...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Super merci beaucoup, j'ai bien compris ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. formulaire:empecher la saisie d'espace(S) dans un input.
    Par cortex024 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/05/2006, 17h53
  2. Réponses: 2
    Dernier message: 11/05/2006, 10h41
  3. Jtable empecher la saisie
    Par uraxyd dans le forum Composants
    Réponses: 2
    Dernier message: 01/12/2005, 14h19
  4. [VB.NET] Empecher la saisie de caractère spéciaux
    Par bloody22 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/07/2005, 11h09
  5. Réponses: 7
    Dernier message: 14/05/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo