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 :

Un simple problème d'entrée au clavier


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Un simple problème d'entrée au clavier
    bnj a tous le monde

    je suis un débutant dans le domain de programmation , j ai voulus cree un simple programme comme un TP des conditions mes j ai racontre un probleme.

    ok voici mon code source

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        int n; //ici j'ai declaré un variable qui s apelle n
     
        printf("bonjour; voulez vous entrer votre nombre ?\n ici :",n); //j'ai demendé de entrer un nombre
        scanf("%d",&n);// recevoi ne nombre avec le scanf
        //ici c'est la conditon :
        if(n>0)//c'est n superieur de 0 afiche "positive"
        {
            printf("positive\n");
        }
        else//c'est inferieur de 0 affiche "negative"
        {
             printf("negative");
        }
        return 0;
    }
    ok tous ça et tres bien passer vous aurez demender il est ou le problem ?!

    je vais vous dir
    quand j entre un 5 il affiche positive
    et quand j entre -5 il affiche negative
    ok tres bien

    mais que je entre n importe quelle autre chose par example
    mqsdmlkd

    il affiche aussi positive
    pourqoi ???
    et pourqoi il n'as pas afficher negative ???

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    Dans le doute je te dirais qu'il recupere le code ascii du premier caractere.
    Pour etre sur tu peux initialiser n a une valeur negative et l'afficher.

  3. #3
    Membre à l'essai
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    et quesque je ferais pour eviter ce genre de problem

    maitenant c'exst un petit programme ok mais quand il devient a grand programme

    il peut devenir un faille non ?

    il faut que je trouve une reponse
    merci

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    Je ne connais pas scanf.
    J'utiliserais getline ou read et je parserais ce que j'aurais lus.
    Les man peuvent t'aider aussi.

  5. #5
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Avec ton scanf et ta chaine de formatage "%d", tu provoques l'interprétation d'un caractère alphabétique comme étant un nombre.
    Pour éviter ça ne le "cast" pas en entier (%d) mais bien en chaine de caractère (%s) : tu peux ensuite procéder à bon nombres de tests sur chacun des caractères pour savoir s'il s'agit d'un nombre, d'une lettre, en minuscule, majuscule, etc ...
    Quand tu auras vérifié que ta chaine est valide tu peux la convertir en entier avec la fonction atoi.

    Bon courage !
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Quand tu auras vérifié que ta chaine est valide tu peux la convertir en entier avec la fonction atoi.
    Il est préférable d'utiliser strtol à la place, car lorsque atoi retourne 0, on ne peut pas savoir si c'est le résultat de la conversion ou une erreur.

  7. #7
    Membre à l'essai
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Merci a tous

    mais vous m avais pas dis comme on utlise c'est truc atoi et ...
    je suis un debutant je n 'ai jamais vu c'est fonction

    et merci

  8. #8
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    je t'ai mis le lien vers la doc ...
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  9. #9
    Membre à l'essai
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    a ok j ai pas vu

    merci

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu peux reste le retour de scanf() pour savoir si un nombre a été lu. Par exemple :
    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
    #include <stdio.h>
     
    int main(void)
    {
        int n; //ici j'ai declaré une variable qui s'appelle n
     
        printf("bonjour; voulez vous entrer votre nombre ?\n ici :",n); //j'ai demandé d'entrer un nombre
        if(scanf("%d",&n)==1) // recevoir le nombre avec le scanf
        {
             //ici c'est la conditon :
            if(n>0)//c'est n supérieur ou égal à 0
            {
               printf("positif ou nul\n");
            }
            else//c'est inferieur à 0 affiche "negatif"
            {
                printf("negatif\n");
            }
        }
        else printf("Ce n'est pas un nombre\n");
        return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par chamsou_23i Voir le message
    il affiche aussi positive
    pourqoi ???
    et pourqoi il n'as pas afficher negative ???
    À noter que tu as remarqué toi-même qu'avec un nombre nul, ton programme doit aussi doit afficher « negative ». Une manière de souligner, donc, qu'une comparaison avec « == » n'a donc pas deux mais trois états possibles : inférieur, supérieur, ou égal.

    Dans le cas présent, quand tu as tapé des lettres, scanf() s'est arrêté dès qu'il a rencontré des caractères qui ne pouvaient pas faire partie de « %d » (soit des chiffres, mais également des blancs, des signes +, -, un point et/ou un exposant éventuel).

    Ton problème vient donc du fait que tu n'as pas initialisé n au départ. scan() n'ayant pu lire le nombre, elle a laissée la variable telle quelle. Celle-ci contient donc une valeur complètement indéfinie (c'est-à-dire ce qu'il y a dans la mémoire à l'endroit où elle a été allouée).

    Si tu remplaces ta ligne 5 par :

    … tu n'auras plus d'ennuis. Cela dit, il te faudra quand même vérifier la valeur de retour de scanf() pour savoir si c'est la valeur initiale que tu lis dans n ou si c'est l'utilisateur qui a explicitement saisi « 0 ».

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

Discussions similaires

  1. problème d'entrée clavier qui ne ressort pas
    Par minimorphee dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 23/03/2014, 18h19
  2. Réponses: 11
    Dernier message: 13/10/2004, 00h58
  3. problème déplacement entre formulaire
    Par estancha dans le forum IHM
    Réponses: 6
    Dernier message: 07/10/2004, 15h22
  4. Comment récuperer des données entrées au clavier?
    Par Elisée A. dans le forum MFC
    Réponses: 2
    Dernier message: 13/02/2004, 07h22
  5. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 14h42

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