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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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

  3. #3
    Membre émérite 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
    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

  4. #4
    Membre confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    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 confirmé Avatar de scofild20
    Inscrit en
    Mars 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 109
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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 ?

  8. #8
    Expert confirmé
    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 : 39
    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
    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 ...

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