Probleme avec les fonctions.

Résolu/Fermé
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015 - Modifié par astengo le 24/08/2014 à 22:12
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015 - 25 août 2014 à 15:45
Bonjour, je commence la programmation avec le bookin qui vient du site du Zero..
je fais un exo ou avec fonctions, structures, prog modulaire .. je dois entrer les parametres (nom, prenom) de plusieurs joueurs. je teste le programme pour l'instant avec un seul joueur.
a l'ecran (sur fond noir) je peux entrer nom, prenom, adresse, parfois l'age. ms apres avoir entré tout ça, je demande à afficher le nom du joueur. le programme ne l'affiche pas il retourne 0 (et desfois un autre nombre...) directement. Je pense que l'erreur vient d'une fonction mal écrite? parce qu'en testant en mettant tout le meme fichier main.c, le 'bug' reste le meme...
j'espere que qcn aura une réponse.
JB.

voila le programme:

main.c:
#include <stdio.h>
#include <stdlib.h>
#include "structure.h"

int main()
{
Personne joueurs;
entree(joueurs);
printf("%s", joueurs.nom);
return 0;
}

structure.c:
#include "structure.h"

void entree (Personne joueur)
{
printf("Entrez votre nom: ");
scanf("%s", joueur.nom);
printf("Entrez votre prenom: ");
scanf("%s", joueur.prenom);
printf("Entrez votre adresse: ");
scanf("%s", joueur.adresse);
printf("Entrez votre age: ");
scanf("%d", joueur.age);
}

void affiche (Personne joueur)
{
printf("%s\n%s\n%s\n%d", joueur.nom, joueur.prenom, joueur.adresse, joueur.age);
}


structure.h:
#ifndef DEF_STRUCTURE
#define DEF_STRUCTURE

typedef struct Personne Personne;
struct Personne
{
char nom[100];
char prenom[100];
char adresse[1000];
int age;
int garcon;
};

void entree (Personne joueur);

void affiche (Personne joueur);

#endif // DEF_STRUCTURE

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 24/08/2014 à 23:10
Plusieurs petites erreurs :

Pour modifier une variable, il faut faire un appel par adresse et non par copie. Donc, il faut plutôt faire dans ton main() :
entree(&joueurs);


Du coup, il faut corriger le prototype de la fonction entree() dans le .h
void entree (Personne *joueur);

Et dans le .c, il faut modifier aussi.
scanf("%s", joueur.adresse);
Attention, avec scanf("%s", ...); tu ne peux rentrer qu'un mot. Tu peux utiliser sinon scanf("%[^\n]",...). Il ne faut pas oublier non plus de vider le buffer clavier. Ce qui donne quelque chose comme (j'ai enlevé les print() pour plus de visibilité).
void entree (Personne *joueur)
{
scanf("%s", joueur->nom);
scanf("%s", joueur->prenom);
getchar();
scanf("%[^\n], joueur->adresse);
printf("Entrez votre age: ");
scanf("%d", &joueur->age);
}

Note : je te conseille de remplacer les scanf() par des fgets() qui sont beaucoup plus secure. Si tu veux un programme plus robuste, il faudra également remplacer le getchar() par ta propre fonction de vidage de buffer clavier. Si tu es intéressé je peux te donner un exemple.

Et enfin : n'oublie pas de mettre un petit '\n' dans le printf() final pour forcer l'affichage.
printf("joueurs.nom=%s\n", joueurs.nom);


Pour la prochaine fois, merci de poster ton code entre deux balises "code c" pour plus de lisibilité. Exemple :
<"code c">/*ici tu tapes ton code*/<"/code"> (à mettre sans guillemets).

S'il reste des erreurs, n'hésite pas à reposter ton code corrigé.

Cdlt,

Google is your friend
0
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015
Modifié par astengo le 25/08/2014 à 00:48
Merci pour ta rpce rapide!
ah oui le code est en couleur comme ça..

Alors j'ai fait les modifs ds les appels et déclarations de fonctions avec les pointeurs comme tu l'as dit, ds tous les fichiers et tt.
la fonction entree donne ça maintenant:
void entree (Personne *joueur)
{
    printf("Entrez votre nom: ");
    scanf("%s", (*joueur).nom);
    getchar();
    printf("Entrez votre prenom: ");
    scanf("%s", (*joueur).prenom);
    getchar();
    printf("Entrez votre adresse: ");
    scanf("%s", (*joueur).adresse);
    getchar();
    printf("Entrez votre age: ");
    scanf("%d", (*joueur).age);
    getchar();
}


j'vais rester au scanf pour l'instant, je cherche surtt à me familiariser avec les pointeurs, fonction, appel de fonction.. et tt ça pour l'instant.
avant le programme mettait parfois 2 lignes d'un coup, c'est à dire il demande le nom et aussi tot le prénom sans laisser la possibilité de répondre, c'est parcequ'il manquait les getchar()?

malgré ça le programme ne fonctionne pas, et renvoit pas 0.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 août 2014 à 00:33
je comprends pas pourquoi ces fleches à la place des points entre la variable et sa composante?
Les flèches sont un raccourcis pour éviter de rappeler qu'il est question de pointeur dans une structure.
Par exemple : joueur->nom signifie : (*joueur).nom. Après libre à toi d'utiliser (*joueur).nom ou joueur->nom.

quand je laisse les points il refuse de compiler car "request for member..."
Si tu mets le ".", il faut mettre (*joueur).nom. Tu ne peux pas faire joueur.nom puisque joueur est de type pointeur. Et le type pointeur est nécessaire pour modifier le contenu d'une variable.

Ok pour rester sur les scanf. Juste n'oublie pas que si tu restes sur le scanf("%s", ...), tu ne pourras pas saisir de phrase, juste des mots. Donc attention pour la variable "adresse" qui contiendra des espaces.
Ou sinon : scanf("%[^\n]",...) qui signifie "je prends tous les caractères jusqu'à l'obtention de la touche entrée". Donc y compris les espaces.

Pour le buffer clavier, il est indispensable si tu utilises scanf("%s[^\n"]", ...). Sinon, le programme ne te laissera pas saisir de mot pour cette ligne. Si tu utilises scanf("%s",...) ou scanf("%d", ...) tu n'as pas besoin de le vider.
0
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015
25 août 2014 à 15:37
Ok, j'vais rester au scanf "tt simple" du coup..
Ces histoires de pointeurs sont encore un peu floues.. donc j'ai fait le programme bcp plus simple, pour bien utiliser seulment les structures. J'ai viré adresse et tout du type structure pour n'avoir qu'un mot a rentrer a chaque fois.
Voila ce qu'il donne:

#include <stdio.h>
#include <stdlib.h>

typedef struct Personne Personne;
struct Personne
{
    char nom[100];
    char prenom[100];
    int age;
};


int main()
{
     Personne joueurs= {"", "", 0};

        printf("Entrez votre nom: ");
        scanf("%s", joueurs.nom);
        printf("Entrez votre prenom: ");
        scanf("%s", joueurs.prenom);
        printf("Entrez votre age: ");
        scanf("%d", joueurs.age);

        printf("%s\n", joueurs.nom);
        printf("%s\n", joueurs.prenom);
        printf("%d\n", joueurs.age);

    return 0;
}


Malgré ça l'exe n'affiche pas les 3 printf finaux, il ne renvoit meme pas 0.. Il doit s'arreter au dernier scanf ?
Sais tu pourquoi?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015
Modifié par evilfalcon le 25/08/2014 à 15:44
il ne manque pas les & sur scanf?
si je en me trompe pas, nous devons écrire:

 scanf("%d",& notre_variable);

tu enregistres sur une adresse?
0
astengo Messages postés 8 Date d'inscription dimanche 24 août 2014 Statut Membre Dernière intervention 29 avril 2015
25 août 2014 à 15:45
putin oui! mtn ça marche.
merci.
0