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 :

Bouclage sur caractère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 1
    Par défaut Bouclage sur caractère
    Bonsoir, j'ai un petit problème, lorsque l'on saisie un caractère a la place d'un nombre dans ce programme, celui-ci boucle.
    comment empêcher ce problème ?
    Merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main()
    {
        int dec;
     
        do {
            printf("Entrer la valeur du decalage (1<n<25) : ");
            scanf("%d", &dec);
        } while(dec<1 || dec>25);
     
        printf("Suite...\n");
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si le scanf() échoue parce que l'entrée ne représente pas un nombre entier valide, alors dec est non modifié et conserve sa valeur antérieure. Dans ton code, dec n'est pas initialisé et contient n'importe quoi, alors le code peut faire dans ce cas n'importe quoi.

    A noter qu'on peut vérifier que l'entrée est valide en testant la valeur de retour du scanf()

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Cela est dû je pense au fait que en C au final un caractère fait référence à une valeur de la table ASCII

    C'est à dire si tu tapes le caractère A par exemple derrière le compilateur va remplacer A par 65 (sauf erreur de ma part)

    Je connais pas la table ascii par cœur; mais il est possible que dans les 25 premiers caractères de a table il y ait celui que tu as entré.

    Sous réserves que je ne dises pas de conneries.

    Le mieux serait d'afficher un message d'erreur disant qu'il faut un chiffre et non un caractère; mais je connais pas la syntaxe en C.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par padaka Voir le message
    Bonsoir, j'ai un petit problème, lorsque l'on saisie un caractère a la place d'un nombre dans ce programme, celui-ci boucle.
    comment empêcher ce problème ?
    Merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main()
    {
        int dec;
     
        do {
            printf("Entrer la valeur du decalage (1<n<25) : ");
            scanf("%d", &dec);
        } while(dec<1 || dec>25);
     
        printf("Suite...\n");
        return 0;
    }
    Bonjour
    Lorsque tu entres un caractère, celui-ci n'étant pas un nombre n'est donc pas récupéré par scanf() et reste dans le clavier. A l'itération suivante, le clavier contenant déjà une info, scanf() ne te laisse pas la main et tente de nouveau de récupérer l'info. Mais cette info est toujours le même caractère. Et voilà comment ton programme part en torche...

    Citation Envoyé par Amnael Voir le message
    Cela est dû je pense au fait que en C au final un caractère fait référence à une valeur de la table ASCII

    C'est à dire si tu tapes le caractère A par exemple derrière le compilateur va remplacer A par 65 (sauf erreur de ma part)

    Je connais pas la table ascii par cœur; mais il est possible que dans les 25 premiers caractères de a table il y ait celui que tu as entré.

    Sous réserves que je ne dises pas de conneries.
    Tu fais des efforts padawan. Tu ne connais pas tout mais ce que tu dis est exact. C'est vrai que A vaut 0x41 ou 65.
    Simplement scanf() ne peut pas récupérer ce 'A' car on lui dit "cherche un nombre" et on lui passe un caractère. Même si c'est un nombre en final, la barrière de contrôle intermédiaire posée par scanf() intercepte et refuse ce caractère.

    Citation Envoyé par Amnael Voir le message
    Le mieux serait d'afficher un message d'erreur disant qu'il faut un chiffre et non un caractère; mais je connais pas la syntaxe en C.
    En fait, il faut d'abord commencer par libérer immédiatement le clavier dès que quelque chose y est saisi (sans se préoccuper de la nature de la saisie). Pour ça, on peut utiliser fgets() qui attend une chaine.
    Une fois que le clavier est redevenu propre, on se préoccupe d'extraire les infos demandées de la chaine saisie. Pour cela il y a sscanf(). Et cette fonction renvoie le nombre exact d'informations correctement récupérées.

    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
    #include <stdio.h>
     
    int saisie(char *prompt)
    {
    	char tampon[256];
    	int val;
     
    	while (1)
    	{
    		fputs(prompt, stdout);
    		fflush(stdout);
    		fgets(tampon, 256, stdin);
    		if ((sscanf(tampon, "%d", &val)) == 1)
    			break;
    		fputs("Saisie incorrecte - Recommencez\n", stdout);
    	}
     
    	return val;
    }
     
    int main()
    {
        int dec;
     
    	do {
    		dec=saisie("Entrer la valeur du decalage (1<n<25) : ");
    	} while(dec<1 || dec>25);
     
        printf("Suite...\n");
        return 0;
    }

    On peut parfaitement effectuer la boucle de saisie dans le main() mais je trouve plus propre d'en faire un module réutilisable dans d'autres conditions...
    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]

Discussions similaires

  1. Ordre tri sur caractère tchèque
    Par shadeoner dans le forum Oracle
    Réponses: 1
    Dernier message: 29/11/2007, 19h53
  2. [hibernate] tri sur caractères spéciaux
    Par Fr@ncky dans le forum Hibernate
    Réponses: 4
    Dernier message: 11/09/2007, 16h50
  3. requête sur caractères accentués
    Par csszzen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/03/2007, 09h15
  4. Problème sur caractère
    Par laurent35 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 24/04/2006, 17h33
  5. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49

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