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 :

problème avec la saisie


Sujet :

C

  1. #1
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut problème avec la saisie
    bonsoir , voila ma problème j'ai ecrit un exercice en C pourtant j'utilise le compilateur de microsot visual c++ (car je me suis familiarisé avec lui)
    le programme marche correctemant sauf lors de la saisie d'un caractère , il dépasse l'instruction de la saisie
    j'ai fait un commantaire dans le code vers la problème
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h>
     
     
    #define LG_NOM 30
    char *c;
     
    struct date{
    	int jour;
    	int mois;
    	int annee;
    };
     
    struct personne{
    	char nom[LG_NOM+1];
    	date date_embauche;
    	date date_poste;
    };
     
    void saisie(struct personne &nouveau )
    {
     
     
    	printf("donner le nom= ");
    	scanf("%s", nouveau.nom);
    	printf("donner la date de l'embauche=");
    	scanf("%d %d %d", &nouveau.date_embauche.jour ,&nouveau.date_embauche.mois, &nouveau.date_embauche.annee );
    	printf("Date poste=Date embauche?(O|N) :");
    	// ma problème est ici lors de la saisie de le caractère c !!
    	scanf("%c", c); // le compilateur ignore cette instruction et passe a la prochaine
     
     
     
     
    		if ((*c=='O') || (*c=='o'))
    		{
    			printf("date poste(jj mm aa):");
    			scanf("%d %d %d",&nouveau.date_poste.jour ,&nouveau.date_poste.mois ,&nouveau.date_poste.annee);
    		}
    }
     
    void affiche(struct personne &nouveau)
    {
    	printf("-------------------------\n");
    	printf("Nom : %s\n",nouveau.nom);
    	printf("Date embauche(jj mm aa): %d %d %d\n",nouveau.date_embauche.jour ,nouveau.date_embauche.mois, nouveau.date_embauche.annee);
    	if (*c!='1' ) printf("Date poste(jj mm aa) : %d %d %d\n", nouveau.date_poste.jour ,nouveau.date_poste.mois, nouveau.date_poste.annee);
    	printf("------------------\n");
     
    }
     
    void main()
    {
    	struct personne nouveau;
     
    	saisie(nouveau);
    	affiche(nouveau);
    }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par scofild20
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *c;
     
    	// ma problème est ici lors de la saisie de le caractère c !!
    	scanf("%c", c); // le compilateur ignore cette instruction et passe a la prochaine
    Heureusement qu'il l'ignore, parce que passer une valeur indéterminée à une fonction invoque un comportement indéfini.

    Si tu n'est pas un expert de scanf(), je te conseille d'utiliser plutôt fgets() ou de fabriquer ta propre fonction d'entrée :

    http://emmanuel-delahaye.developpez.com/inputs.htm
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par scofild20
    bonsoir , voila ma problème j'ai ecrit un exercice en C pourtant j'utilise le compilateur de microsot visual c++ (car je me suis familiarisé avec lui)
    le programme marche correctemant sauf lors de la saisie d'un caractère , il dépasse l'instruction de la saisie
    j'ai fait un commantaire dans le code vers la problème
    Comment pourrait-il fonctionner correctement alors qu'il ne compile meme pas :
    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
     
    Project   : Console application
    Compiler  : GNU GCC Compiler (called directly)
    Directory : E:\Tmp\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:17: error: syntax error before "date"
    main.c:17: warning: no semicolon at end of struct or union
    main.c:18: warning: type defaults to `int' in declaration of `date_poste'
    main.c:18: warning: data definition has no type or storage class
    main.c:21: error: syntax error before '&' token
    main.c: In function `saisie':
    main.c:24: error: `nouveau' undeclared (first use in this function)
    main.c:24: error: (Each undeclared identifier is reported only once
    main.c:24: error: for each function it appears in.)
    main.c: At top level:
    main.c:38: error: syntax error before '&' token
    main.c: In function `affiche':
    main.c:41: error: `nouveau' undeclared (first use in this function)
    main.c: At top level:
    main.c:50: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:51: error: storage size of 'nouveau' isn't known
    main.c:51: warning: unused variable `nouveau'
    Process terminated with status 1 (0 minutes, 1 seconds)
    8 errors, 5 warnings
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  4. #4
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    il fonctionne car je compile sous microsoft visual c++
    il me faut du temps pour pouvoir changer de compilateur vers code::block
    en tout cas sous microsoft visual c++ il ne me signe aucune erreur ou warning
    sinon quelqu'un peut corriger l'erreur?

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par scofild20
    il fonctionne car je compile sous microsoft visual c++
    il me faut du temps pour pouvoir changer de compilateur vers code::block
    en tout cas sous microsoft visual c++ il ne me signe aucune erreur ou warning
    sinon quelqu'un peut corriger l'erreur?
    Il doit certainement y avoir un moyen de règler de manière appropriée le niveau d'avertissement et d'erreur du compilateur de Microsoft... Je ne connais malheureusement pas assez cet outil. Ceci dit, il n'y a absolument aucune chance que ton programme compile avec un compilateur C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void saisie(struct personne &nouveau )
    {
        /* ... */
    }
    Ce code ressemble à du C++, car les références n'existent pas en C. Toutefois, le mot clé struct utilisé dans ce contexte n'est pas obligatoire en C++. Est-tu certain de compiler avec un compilateur C? L'extention de ton fichier d'implantation est bien .c et non .cpp, n'est-ce pas? Si tu passes un fichier .cpp au compilateur Microsoft, c'est le compilateur C++ qui est utilisé...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void saisie(struct personne &nouveau )
    {
        /* ... */
    }
    c'est vrais cette expression n'existe pas en c , c'est du c++ , pour rendre mon code en c il me faut beaucoups de changement , genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void saisie(struct personne nouveau)
    pour l'instant je travaille avec des fichier .cpp
    la question est : est ce que je dois travailler d'abord avec la langage c ou passer directement au c+ ??

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par scofild20
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void saisie(struct personne &nouveau )
    {
        /* ... */
    }
    c'est vrais cette expression n'existe pas en c , c'est du c++ , pour rendre mon code en c il me faut beaucoups de changement , genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void saisie(struct personne nouveau)
    Insuffisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void saisie(struct personne *nouveau)
    et utiliser nouveau->xxx au lieu de nouveau.xxx
    pour l'instant je travaille avec des fichier .cpp
    Donc en C++.
    la question est : est ce que je dois travailler d'abord avec la langage c ou passer directement au c++ ??
    Ca dépend de ton but. Tu veux apprendre un langage de programmation pour en faire quoi ?
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    C'est vrai que scanf() est une fonction un peu capricieuse. Normalement avant la saisie d'un caractère ou d'une chaine de caractère, il faut d'abord vider le buffer du clavier
    Voici un exemple qui va t'aider à mieux comprendre:
    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
    #include <stdio.h>
    int main(void)
    {
        int n;
        char c;
     
        printf("Entrez un entier      : ");
        scanf("%d", &n);
        printf("Entrez un caractere : ");
        scanf("%c", &c);
     
        printf("Le nombre que vous avez entre est    : %d\n", n);
        printf("Le caractère que vous avez entre est : %c\n", c);
     
        return 0;
    }
    L'utilisateur va donc taper un nombre entier puis valider sa saisie en frappant la touche ENTREE. A l'instruction scanf("%c", &c);, le caractère de fin de ligne '\n', engendré par la touche ENTREE, sera placé dans c! Et le programme continue ...

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Melem
    C'est vrai que scanf() est une fonction un peu capricieuse. Normalement avant la saisie d'un caractère ou d'une chaine de caractère, il faut d'abord vider le buffer du clavier
    Non. Au contraire, c'est après la saisie qu'il faut nettoyer.

    1 - J'utilise
    2 - Je nettoie

    Simple bon sens. C'est pas comme ça chez toi ?

    Non. fflush() n'est défini que pour les flux sortants. C'est une FAQ.

    Les bonnes techniques ont été exposées de nombreuses fois, y compris dans la FAQ. Merci de ne pas donner de mauvaises solutions aux débutants qui n'ont pas besoin de ça et de nous épargner du travail de contre-information. On a pas que ça à faire...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Melem
    C'est vrai que scanf() est une fonction un peu capricieuse. Normalement avant la saisie d'un caractère ou d'une chaine de caractère, il faut d'abord vider le buffer du clavier
    Perdu, la norme n'autorise pas de vider le tampon d'un flux entrant à l'aide de la fonction fflush(). Voici deux manières de vider le tampon du flux d'entrée standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void vider_stdin(void)
    {
        int c;
        while ((c = fgetc(stdin)) != '\n' && c != EOF)
        {
            continue;
        }
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void vider_stdin(void)
    {
        scanf("%*[^\n]");
        getchar();
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    merci pour vos aides
    en ajoutant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void vider_stdin(void)
    {
        scanf("%*[^\n]");
        getchar();
    }
    le programme fonctionne correctement
    Donc en C++.

    Citation:
    la question est : est ce que je dois travailler d'abord avec la langage c ou passer directement au c++ ??

    Ca dépend de ton but. Tu veux apprendre un langage de programmation pour en faire quoi ?
    j'ai commencé avec le VB maintenant je débute le C
    je suis étudiant en systèmes d'information et réseaux evolué (1ère année)
    donc j'ai pas une idée claire que vais je faire .

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par scofild20
    j'ai commencé avec le VB maintenant je débute le C
    je suis étudiant en systèmes d'information et réseaux evolué (1ère année)
    donc j'ai pas une idée claire que vais je faire .
    Il est difficile de répondre à ta question sans risquer de se faire taper sur les doigts. De manière générale, une bonne connaissance du langage C ne peut être que bénéfique dans ta carrière professionnelle.

    Si toutefois ton but à terme est de programmer en C++, l'expérience montre souvent qu'il est peut-être plus efficace de commencer directement par le C++ et en utilisant par exemple directement le type string en remplacement des chaînes de caractères style C, le type vector en remplacement des tableaux, et les idiomes spécifiques pour les entrées/sorties en remplacement des fonction printf(), scanf() ou encore fgets(). En effet, les programmeurs habitués au C ont tendance à utiliser C++ comme du C with classes. De très bons ouvrages tels que "Accelerated C++" de Andrew Koenig et Barbara E. Moo, chez Addison Wesley, utilisent cette approche et introduisent petit à petit les détails de bas niveaux tels que la gestion des chaînes de caractères dans le style C, la gestion de la mémoire, les tableaux, etc.

    Si ton objectif est de faire de la programmation système, de l'embarqué, ou tout simplement que tu n'as pas peur d'entrer dans les détails de bas niveau, le langage C te permettra d'apprendre beaucoup sur les différences entre les systèmes et entre les architectures matérielles, les enjeux liés à la portabilité, la gestion des chaînes de caractères, gestion de la mémoire, etc. Le langage C est un langage compact aux possibilités immenses et il est rempli de subtilités. C'est d'ailleurs ce qui en fait la difficulté, car il est facile de faire n'importe quoi. C'est un langage difficile pour les débutants, mais c'est un excellente occasion d'apprendre la rigueur.

    Ceci dit, programmer en C ne t'empêchera en rien de passer à C++ ensuite. Je dirais donc qu'il n'est pas obligatoire, contrairement aux idées réçues, d'apprendre le C dans le but de faire du C++. C'est une bonne chose si ton but est de programmer en C. Dans une certaine mesure, il faut considérer ces deux langages comme des langages distincts. Bien sûr, il y a un héritage commun important, et dans la pratique, il est nécessaire d'être conscient des similitudes et des différences entre ces langages. Dans la pratique également, on trouve de nombreux projets mixtes où une partie importante de code hérité écrit en C est utilisé par des sources C++.

    En conclusion, la réponse dépend de toi, des domaines d'application qui t'intéressent ou des impératifs liés à la carrière à laquelle tu aspires dès la fin de tes études.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Membre du Club Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    Points : 47
    Points
    47
    Par défaut
    merci mujigka ,
    avec le temps je ferais mon choix

Discussions similaires

  1. problème avec les saisies
    Par cysboy dans le forum Ubuntu
    Réponses: 4
    Dernier message: 09/06/2008, 14h03
  2. Réponses: 8
    Dernier message: 07/02/2008, 14h25
  3. [MySQL] Problème avec la saisie d'un champ
    Par zoom61 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/08/2006, 13h49
  4. Excel : problème avec la saisie d'heure
    Par an_merle dans le forum Excel
    Réponses: 1
    Dernier message: 21/02/2006, 22h26
  5. Problème avec la saisie semi-automatique d'internet explorer
    Par haltabush dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 07/02/2006, 13h23

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