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 :

struct dans struct, remplir dans function


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 11
    Points
    11
    Par défaut struct dans struct, remplir dans function
    Bonjour,

    dans le cadre de mes études (rien à voir avec la prog.), je suis un cours de programmation en C.
    Je débute complètement, et je rencontre un souci avec un exercice, le but est de générer une sorte de base de donnée avec les ouvriers d'une entreprise.

    Le sujet de l'exercice impose la création initiale d'une structure "ouvrier", et d'une sous-structure "date de naissance" dépendent d'ouvrier.
    Je n'ai jamais travaillé avec des structures avant et mon cours est vraiment succin sur le sujet (il s'agit d'un cours à distance, sous forme de Power Point très succin)
    J'ai déjà fait pas mal de recherche sur le net ou j'ai pu trouver beaucoup d'infos et d'exemples, mais les exemples de struct dans des structs sont très rares, et tout se passe dans la fonction "main", d'où mes questions.

    Ci-dessous les infos concernant les déclarations des structures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct{
        int jour;
        int mois;
        int annee;
    } DateNais; // déclaration de la structure DateNais
     
    typedef struct{
        char nom[30];
        char prenom[30];
        DateNais Date;
    } Ouvrier; // déclaration de la structure Ouvrier
    Dans une première question, l'objectif est de renseigner les infos d'un ouvrier, puis de les afficher à l'écran. J'ai donc le programme suivant*:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    //Déclaration de la structure
     
    typedef struct{
        int jour;
        int mois;
        int annee;
    } DateNais; // déclaration de la structure DateNais
     
    typedef struct{
        char nom[30];
        char prenom[30];
        DateNais Date;
    } Ouvrier; // déclaration de la structure Ouvrier
     
     
    int main(void)
    {
        Ouvrier ouv1; //Création de l'ouvrier ouv1
     
        /* Lire les détails de l'ouvrier*/
        printf ("\nRenseigner les informations de l'ouvrier \n");
        printf("Nom ?");    gets (ouv1.nom);
        printf("Prenom ?");    gets (ouv1.prenom);
        printf("Annee de naissance (jj:mm:aaaa) ?");     scanf("%d:%d:%d",&ouv1.Date.jour,&ouv1.Date.mois,&ouv1.Date.annee );
     
     
        /*Ecrire les détails de l'ouvrier*/
        printf ("\nLes informations sont: \n");
        printf ("Nom : %s \n", ouv1.nom);
        printf ("Prenom : %s \n", ouv1.prenom);
        printf ("Date de naissance : %02d:%02d:%d \n",ouv1.Date.jour,ouv1.Date.mois,ouv1.Date.annee);
     
        return 0;
     
    }
    Cette partie du code fonctionne correctement selon moi.


    Pour la seconde question, le but est d'aller plus loin en permettant au programme de renseigner plusieurs ouvriers, et de les afficher si souhaité.
    La question ne me paraît pas difficile, mais je souhaite créer une fonction pour ajouter un ouvrier, et créer une autre fonction pour afficher les infos renseignée d'un ouvrier, en réutilisant les bouts de programmes affichés plus haut dans mon main.
    Le souci est que je rencontre quelques soucis pour créer ces fonctions, en particulier pour la date de naissance, je ne sais pas comment accéder à la sous-structure "Date" dans la structure "ouvrier" depuis la fonction "lire"...

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    //Déclaration de la structure
     
    typedef struct datenais{
        int jour;
        int mois;
        int annee;
    } DateNais; // déclaration de la structure DateNais
     
    typedef struct ouvrier{
        char nom[30];
        char prenom[30];
        DateNais Date;
    } Ouvrier; // déclaration de la structure Ouvrier
     
     
    void lire (struct ouvrier *ouvX)
    {
        /* Lire les détails de l'ouvrier*/
        printf ("\nRenseigner les informations de l'ouvrier \n");
        printf("Nom ?");    scanf ("%s",ouvX->nom);
        printf("Prenom ?");    scanf ("%s",ouvX->prenom);
        printf("Annee de naissance (jj:mm:aaaa) ?");     scanf("%d:%d:%d", ouvX->Date.jour,ouvX->Date.mois,ouvX->Date.annee );
     
        /* 
        printf ("\nLes informations sont: \n");
        printf ("Nom : %s \n", ouvX->nom);
        printf ("Prenom : %s \n", ouvX->prenom);
        printf ("Date de naissance : %02d:%02d:%d \n",ouvX->Date.jour,ouvX->Date.mois,ouvX->Date.annee); 
        */
     
    }
     
    int main(void)
    {
        Ouvrier ouv1; //Création de l'ouvrier ouv1
        lire(&ouv1);
     
     
        /*Ecrire les détails de l'ouvrier*/
        printf ("\nLes informations sont: \n");
        printf ("Nom : %s \n", ouv1.nom);
        printf ("Prenom : %s \n", ouv1.prenom);
        printf ("Date de naissance : %02d:%02d:%d \n",ouv1.Date.jour,ouv1.Date.mois,ouv1.Date.annee);
     
        return 0;
     
    }
    J'ai les questions suivantes*:

    - D'une part, j'ai changé les gets en scanf pour renseigner le nom et le prénom, car je n'arrivais pas réutiliser gets dans la fonction. Ça fonctionne bien avec scanf, mais j'aimerais comprendre comment utiliser gets dans la fonction... comment faire ?

    - Ensuite, je n'arrive pas à renseigner les infos de la sous-structure "Date", le programme se lance bien, mais j'ai un message d'erreur avant me disant que chaque scanf ("%d") est int *, mais que ouvX->Date. jour ou mois ou année est int. Et le programme plante quand je renseigne les dates...
    Comment faire pour remplir correctement  les dates dans les sous-structures ? ça doit encore être une histoire de pointeur.

    - Et pour finir, je créé un ouvrier dans la fonction main, mais est-il possible de le faire dans la fonction lire  ? (je ne pense pas, sinon l'ouvrier disparait de la mémoire à la fin de la fonction lire, mais je ne suis pas sur).

    Merci d'avance pour votre aide,

    Frédéric

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par sfritz Voir le message
    Ci-dessous les infos concernant les déclarations des structures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct{
        int jour;
        int mois;
        int annee;
    } DateNais; // déclaration de la structure DateNais
     
    typedef struct{
        char nom[30];
        char prenom[30];
        DateNais Date;
    } Ouvrier; // déclaration de la structure Ouvrier
    Pour une plus grande clarté dans la lecture (ou relecture) on a l'habitude de nommer les types "t_xxx". Ca permet de laisser le token "Ouvrier" libre pour un nom de variable et surtout d'identifier facilement "type" et "variable" dans le code.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Déclaration de la structure pour une date (de naissance, de décès, de mariage, ...)
    typedef struct {
    	unsigned short jour;
    	unsigned short mois;
    	unsigned short annee
    } t_date;
     
    // Déclaration de la structure pour un brave gars (un coiffeur, un facteur, un boulanger, un ouvrier)...
    typedef struct {
    	char nom[30+1];
    	char prenom[30+1];
    	t_date naissance;
    } t_ouvrier,		// Ok on va pas perturber ton prof, on laisse "ouvrier"

    Citation Envoyé par sfritz Voir le message
    Cette partie du code fonctionne correctement selon moi.
    Oui mais gets() est une fonction dangereuse (qui ne limite pas la saisie). Normalement le compilateur a dû te le dire.
    Ton nom fait 30c. mais gets() n'interdira pas d'en saisir 500. Et là ben...
    Tu peux remplacer gets(ouv1.nom) par fgets(ouv1.nom, 30, stdin) et si tu utilises ma structure où j'ai écrit "30+1" alors fgets(ouv1.nom, 30+1, stdin) (pourquoi "30+1"? Parce que fgets() retire 1c. à la taille qu'on lui donne pour y stocker le '\0' donc comme je veux en saisir réellement 30 je demande un de plus à fgets() qui va en retirer un et au total 30+1-1=30).

    Citation Envoyé par sfritz Voir le message
    - D'une part, j'ai changé les gets en scanf pour renseigner le nom et le prénom, car je n'arrivais pas réutiliser gets dans la fonction. Ça fonctionne bien avec scanf, mais j'aimerais comprendre comment utiliser gets dans la fonction... comment faire ?
    gets(ouvX->nom) ou fgets(ouvX->nom, 30, stdin). Je ne vois pas pourquoi tu n'y es pas arrivé.

    Citation Envoyé par sfritz Voir le message
    - Ensuite, je n'arrive pas à renseigner les infos de la sous-structure "Date", le programme se lance bien, mais j'ai un message d'erreur avant me disant que chaque scanf ("%d") est int *, mais que ouvX->Date. jour ou mois ou année est int. Et le programme plante quand je renseigne les dates...
    Tu as oublié le "&" devant les variables. ouvX->Date.jour reste un int donc comme pour tout int, on donne son adresse à scanf(). Donc c'est exactement ce que dit le message d'erreur. scanf() attend un int étoile (ie une adresse) et tu lui passes un int.

    Citation Envoyé par sfritz Voir le message
    - Et pour finir, je créé un ouvrier dans la fonction main, mais est-il possible de le faire dans la fonction lire  ? (je ne pense pas, sinon l'ouvrier disparait de la mémoire à la fin de la fonction lire, mais je ne suis pas sur).
    Exact. Toute variable locale à une fonction disparait quand la fonction se termine. Justement il y a une discussion récente à ce sujet.
    Seule solution si tu veux pas déclarer ton ouvrier dans la fonction appelante : allouer de la mémoire pour ton ouvrier dans la fonction appelée (l'allocation se fait alors dans une zone mémoire globale au programme donc en dehors de la fonction et qui donc ne disparait pas avec la fonction) et retourner le pointeur de cette zone allouée.
    C'est plus lourd et plus complexe (faut tester l'allocation, prévoir une solution alternative si elle ne se fait pas, et ne pas oublier de libérer la zone quand on n'en a plus besoin)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    merci pour les infos.
    J'ai mis à jour mon code, et ça fonctionne bien.

    Par contre, j'ai encore un souci d'affichage...
    Je souhaite afficher les infos des ouvriers sous forme de table propres, avec une ligne par ouvrier. Le souci que j'ai est qu'en renseignant les infos de l'ouvrier avec fgets, j'ai automatiquement un saut de ligne quand je veux afficher le contenu avec printf.

    En d'autres termes, si j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(ouvX->nom, 30, stdin);
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%-30s \t|", ouvX->nom);
    j'ai un saut de ligne entre "%-30s" et "/t".

    Je n'ai pas la même chose en utilisant scanf à la place de fgets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%s",ouvX->nom);
    ce qui me permet d'afficher toutes les infos sur la même ligne, sans les sauts de ligne non voulu.

    Pourquoi?
    Comment faire avec fgets?

    Merci

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    Oui il faut peut-être faire un "chop" de ta chaîne et "virer le '\n' " saisi avec fgets().

    The fgets() function shall read bytes from stream into the array pointed to by s, until n−1 bytes are read, or a <newline> is read and transferred to s, or an end-of-file condition is encountered. The string is then terminated with a null byte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strTest[strlen(strTest)-1]='\0';

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sfritz Voir le message
    Je n'ai pas la même chose en utilisant scanf à la place de fgets:
    Oui, parce que scanf() shunte le '\n'. Pour un TP ou code test, tu peux rester sur scanf(), c'est pas super grave. Enfin ça dépend aussi de ton prof mais un prof qui conseille gets() me semble pas super pointilleux concernant le dépassement de capacité.

    Si tu veux passer par fgets(), la solution de hurukan est pas mal mais pas parfaite (il peut arriver parfois que ta saisie ne contienne pas de '\n' et dans ce cas cette méthode supprime le dernier caractère saisi).
    En voici une autre qui s'adapte mieux aux différentes possibilités : ouvX->nom[strcspn(ouvX->nom, "\n")]='\0'.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 579
    Points : 7 702
    Points
    7 702
    Par défaut
    On peut aussi utiliser un scanf() qui fera le même boulot que fgets() tout en ôtant le '\n'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf( "%30[^\n]\n" , ouvX->nom );              // lit toute la ligne, le \n est extrait mais as copié
    // au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fgets( ouvX->nom, 31, stdin );           // lit toute la ligne, le \n est copié si trouvé avant la taille max, il faut l'enlever après
    const size_t  len = strlen(ouvX->nom);
    if ( len  &&  ouvX->nom[len-1] == '\n' )
        ouvX->nom[len-1] = '\0';             // ôte le \n s'il y en avait bien un
    Attention, la taille à indiquer est le buffer complet dans le cas fgets() donc inclura le '\n' et le '\0'.
    Dans le cas du scanf() sscanf(), la taille indiquée est la taille utile sans le terminateur(donc taille du tableau - 1)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 11
    Points
    11
    Par défaut
    Je rencontre un souci supplémentaire avec fgets...

    Dans certains cas, l'étape fgets est sauté (je ne peux rien entrer, ça passe directement à l'étape suivante), mais ça n'arrive pas quand j'utilise scanf.
    Savez-vous d'où cela peut venir ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void lire (struct t_Ouvrier *ouvX, int i) //Permet d'enregister les nouveaux ouvriers
    {
        printf ("\nVeuillez renseigner les informations de l'ouvrier %d: \n", i+1);
        printf("Nom :\t");    
        fgets(ouvX->nom, 30, stdin);  
        printf("Prenom :\t");    
        fgets(ouvX->prenom, 30, stdin); 
        printf("Annee de naissance (jj/mm/aaaa) :\t");     
        scanf("%d/%d/%d", &ouvX->Date.jour,&ouvX->Date.mois,&ouvX->Date.annee );
    }
    Dans cette fonction, le fgets du nom est sauté alors que celui de prénom ne l'est pas...

    Merci,

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sfritz Voir le message
    Savez-vous d'où cela peut venir ?
    Du <return> sur lequel tu appuies quand tu saisis un nombre. Ce caractère n'étant pas du numérique, il n'est pas récupéré par scanf("%d", ...) et reste dans le clavier. Il est alors automatiquement récupéré par le fgets() suivant.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 652
    Points : 1 669
    Points
    1 669
    Par défaut
    Hello,

    Citation Envoyé par hurukan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strTest[strlen(strTest)-1]='\0';
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strTest[strcspn(strTest, "\n")]=0;

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Du <return> sur lequel tu appuies quand tu saisis un nombre. Ce caractère n'étant pas du numérique, il n'est pas récupéré par scanf("%d", ...) et reste dans le clavier. Il est alors automatiquement récupéré par le fgets() suivant.
    Je valide bien des infos avec "Entrer" en amont du fgets.
    Et est-il possible de s'en affranchir, pour utiliser la fonction fgets correctement ?

    Merci

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sfritz Voir le message
    Je valide bien des infos avec "Entrer" en amont du fgets.
    Hé oui, on ne peut pas valider sans appuyer sur cette touche.

    Citation Envoyé par sfritz Voir le message
    Et est-il possible de s'en affranchir, pour utiliser la fonction fgets correctement ?
    Réfléchis. Ce n'est pas fgets() le souci, le souci c'est "un" caractère parasite présent dans le clavier après ta saisie de tes dates.
    Donc pour utiliser fgets() il faut d'abord le ...

    Une autre solution (celle que j'applique) est de créer une fonction dédiée à la saisie d'un int. Cette fonction commence par utiliser fgets() pour saisir ce que tape l'utilisateur (y compris le <return> casse burnes), saisie stockée dans un char[], puis utilise sscanf() pour extraire le nombre saisi. Ainsi le clavier reste clean.

    Ou alors tu en restes aux scanf() pour toutes tes saisies. Je ne pense pas que pour ce TP ce soit catastrophique.

  12. #12
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 652
    Points : 1 669
    Points
    1 669
    Par défaut
    Hello,

    Citation Envoyé par sfritz Voir le message
    Et est-il possible de s'en affranchir, pour utiliser la fonction fgets correctement ?
    Voir la faq c

  13. #13
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    strTest[strcspn(strTest, "\n")]=0;
    Oui c'est encore plus beau... j'ai utilisé strTest par rapport à une source où j'ai dû virer le '\n' du fgets()... mais ici il s'agit d'un des champs de la structure t_Ouvrier.

    Sinon il existe des fonctions qui saisissent une chaîne sans devoir appuyer sur entrée mais je ne me rappele plus du nom ni de l'include...
    getdelim() dans stdio.h --> le délimiteur est quand même dedans :{

    Non, dans ce cas il faut créer une fonction qui saisi une chaîne caractère par caractère mais qui fait le "bypass" du '\n'.
    Pour mes labos sur Linux (sur Windows ça ne marche pas) j'ai fait ceci: https://github.com/truesoundlord/lib...aster/uep_wide.

    Ce qui pourrait t'intéresser c'est la fonction getnchar()...

  14. #14
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 652
    Points : 1 669
    Points
    1 669
    Par défaut
    Le problème avec fgets(), c'est que si tu entres plus de caractères que la taille de la variable de réception, par exemple dans ce code
    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>
    #include <string.h>
     
    int main(void) {
    	char str[10];
    	fputs("? > ",stdout);
    	fgets(str,sizeof(str),stdin);
     
    //	str[strcspn(str,"\n")]=0;
     
    	str[strlen(str)-1]='\0';
     
    	fputs(str,stdout);
     
    	return(0);
    }
    si tu entres abcdefghijklmnop, il n'y a pas de \n, et donc la variable str est tronquée à "abcdefgh", soit 8 caractères.

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

Discussions similaires

  1. [AJAX] return dans function
    Par lili2704 dans le forum AJAX
    Réponses: 5
    Dernier message: 20/10/2010, 21h41
  2. Valeur CheckBox erronee dans Function
    Par ConteZero dans le forum VB.NET
    Réponses: 3
    Dernier message: 01/07/2010, 14h58
  3. Passer 2 structs a la function callback
    Par 0xpoint dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 03/09/2009, 16h07
  4. création de composant erreur dans function
    Par OutOfRange dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/01/2009, 14h48
  5. bean:define pour passage variable dans function javascript
    Par fbuchwalder dans le forum Struts 1
    Réponses: 2
    Dernier message: 06/11/2006, 18h36

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