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 :

aide dans les struct svp


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 61
    Par défaut aide dans les struct svp
    Bonjour, je suis en plein dans les structures et j'ai un petit 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
    #include <stdio.h>
    #include <stdlib.h>
    struct personne
    {
       char nom[100];
       char prenom[100];
    };
     
     
     
    int main()
    {
    	struct personne point;
    	printf("Quel est votre nom?");
    	scanf("%s", personne.nom);
    	printf("\nQuel est votre prenom?\n", personne.prenom);
    	scanf("%ld", personne.nom);
    	printf(" Vous vous apelez %s %s\n", personne.nom, personne.prenom);
     
    	return 0;
    }
    Merci, je comprends vraiemnt pas sa marche pas??

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    ici tu déclares la variable "point" de type "personne" c'est ok ?
    Donc là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s", personne.nom);
    ce n'est pas "personne.nom" mais "point.nom" qu'il faut utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\nQuel est votre prenom?\n", personne.prenom);
    Tu veux faire quoi là avec "personne.prenom" ? l'afficher? => il manque un formateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%ld", personne.nom);
    " %ld " c'est quoi ça?
    Pour une chaine c'est %s, tu l'as bien fait dans le reste du code!
    un peu de rigueur..

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par freecircus
    Tu veux faire quoi là avec "personne.prenom" ? l'afficher? => il manque un formateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%ld", personne.nom);
    Ouais sauf que là il veut pas l'afficher mais plutôt saisir puis stocker dans le tableau de char "nom" mais l'utilisation de scanf est à bannir, préfère plutôt fgets et avec celle-ci, tu lis le flux standard d'entrée stdin.

    N'oublie pas non plus qu'il faut également vérifier la présence du caractère de saut de ligne \n que fgets ajoute si elle en trouve un. Tu peux nettoyer ta chaine en ajoutant à la place le \0 de fin de chaîne comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * p = strchr (buffer, '\n');
     
    if (p != NULL)
    {
       *p = 0;
    }
    Voilà, je pense avoir tout dit !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s", personne.nom);
    Ce n'est pas la structure "personne" qu'il faut utiliser ici, mais la variable du type de ta structure que tu as déclarée dans ton main soit "point", idem pour les autres !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    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 mitherkiller
    struct personne
    {
    char nom[100];
    char prenom[100];
    };

    int main()
    {
    struct personne point;
    scanf("%s", personne.nom);
    Quel est le nom de l'objet ?

    scanf("%ld", personne.nom);
    Ensuite, %ld pour une chaine, ça va pas le faire...

  6. #6
    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 Franck.H
    Voilà, je pense avoir tout dit !
    ... et purger le flux en cas d'absence du '\n', sinon, on se retrouve avec le syndrome de scanf().. 'ça s'arrête pas'...

  7. #7
    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 Franck.H
    Ouais sauf que là il veut pas l'afficher mais plutôt saisir puis stocker dans le tableau de char "nom" mais l'utilisation de scanf est à bannir, préfère plutôt fgets et avec celle-ci, tu lis le flux standard d'entrée stdin.

    N'oublie pas non plus qu'il faut également vérifier la présence du caractère de saut de ligne \n que fgets ajoute si elle en trouve un. Tu peux nettoyer ta chaine en ajoutant à la place le \0 de fin de chaîne comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * p = strchr (buffer, '\n');
     
    if (p != NULL)
    {
       *p = 0;
    }
    Voilà, je pense avoir tout dit !
    Si vraiment tu veux nettoyer, il te faut encore vider le tampon du flux entrant en cas d'absence du caractère de fin de ligne '\n':
    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
    void fclean(char *buffer, FILE *stream)
    {
        /* On recherche la présence de '\n' dans le tampon buffer */
        char * p = strchr (buffer, '\n');
     
        if (p != NULL) /* '\n' a été trouvé */
        {
           *p = 0;
        }
        else /* L'entrée a été tronquée: on vide le tampon du flux stream */
        {
            int c;
            while ((c = fgetc(stream)) != '\n' && c != EOF)
            {
                continue;
            }
        }
    }
    Le mieux est de se construire ses propres fonctions qui intègrent la saisie et le nettoyage.

    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++

    +

  8. #8
    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
    Voici une réécriture de ton programme en utilisant fgets:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct Personne
    {
        char nom[30];
        char prenom[30];
    };
     
    static void fclean(char *buffer, FILE *stream);
     
    int main(void)
    {
        struct Personne pers;
        printf("Quel est votre nom?\n");
        /* On réalise la saisie et on nettoie*/
        fgets(pers.nom, sizeof pers.nom, stdin);
        fclean(pers.nom, stdin);
     
        printf("Quel est votre prenom?\n");
        /* On réalise la saisie et on nettoie*/
        fgets(pers.prenom, sizeof pers.prenom, stdin);
        fclean(pers.prenom, stdin);
     
        printf("Vous vous appelez %s %s\n", pers.nom, pers.prenom);
     
        return EXIT_SUCCESS;
    }
     
    static void fclean(char *buffer, FILE *stream)
    {
        /* On recherche la présence de '\n' dans le tampon buffer */
        char * p = strchr (buffer, '\n');
     
        if (p != NULL) /* '\n' a été trouvé */
        {
            *p = 0;
        }
        else /* L'entrée a été tronquée: on vide le tampon du flux stream */
        {
            int c;
            while ((c = fgetc(stream)) != '\n' && c != EOF)
            {
                continue;
            }
        }
    }
    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++

    +

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    ... et purger le flux en cas d'absence du '\n', sinon, on se retrouve avec le syndrome de scanf().. 'ça s'arrête pas'...
    Ouais exacte, j'avais oublié de le mentioner
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Aide pour les sockets svp
    Par sabiha93 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 03/02/2008, 08h43
  2. Aide sur les VBox SVP
    Par gedeon555 dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 09/11/2007, 11h07

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