3 réponses
et le problème de décalage, est-ce qu'il recommence après encore (avec les autres choses comme loisir ?) ou seulement pour la musique ?
PS : tu n'as pas besoin de caster tes malloc il me semble...
PS : tu n'as pas besoin de caster tes malloc il me semble...
j'ai fait une modification de scanmusic de la façon suivante :
On a donc un printf qui affiche i dans la boucle pour qu'on puisse voir ou on en est rendu.
le programme me donne ceci :
[...]
Gouts musicaux : (3 maximum, pas plus de 20 caracteres chacun)0
gout1
gout2
1
gout3
2
gout4
Sports pratiques [...]
et là je pige pas, mais alors vraiment pas, pourquoi dans le même tour de boucle il demande 2 fois une entrée au clavier...
Sinon pour le cast des malloc j'en avais pas entendu parler avant donc j'ai fait quelques recherches (on nous avait appris à faire comme ça en cours), et apparemment y'aurait pas besoin mais pour une raison quelconque codeblocks ne veut pas compiler si je le vire (invalid pointer conversion quelquechose comme ça).
void scanmusic(pfiche a, FILE* flot) { int i; for (i=0;i<BORNE;i++) { a->music[i]=(char*)malloc(TAILLE*sizeof(char)); printf("%d \n", i); fscanf(flot,"%s ", a->music[i]); } }
On a donc un printf qui affiche i dans la boucle pour qu'on puisse voir ou on en est rendu.
le programme me donne ceci :
[...]
Gouts musicaux : (3 maximum, pas plus de 20 caracteres chacun)0
gout1
gout2
1
gout3
2
gout4
Sports pratiques [...]
et là je pige pas, mais alors vraiment pas, pourquoi dans le même tour de boucle il demande 2 fois une entrée au clavier...
Sinon pour le cast des malloc j'en avais pas entendu parler avant donc j'ai fait quelques recherches (on nous avait appris à faire comme ça en cours), et apparemment y'aurait pas besoin mais pour une raison quelconque codeblocks ne veut pas compiler si je le vire (invalid pointer conversion quelquechose comme ça).
Bon en fait j'ai carrément mis 2 printf :
on a maintenant :
Gouts musicaux : (3 maximum, pas plus de 20 caracteres chacun)0
gout1
gout2
0
1
gout3
1
2
gout4
2
Donc c'est un seul fscanf qui réclame deux entrées, c'est étrange non ?
void scanmusic(pfiche a, FILE* flot) { int i; for (i=0;i<BORNE;i++) { a->music[i]=(char*)malloc(TAILLE*sizeof(char)); printf("%d \n",i); fscanf(flot,"%s ", a->music[i]); printf("%d \n",i); } }
on a maintenant :
Gouts musicaux : (3 maximum, pas plus de 20 caracteres chacun)0
gout1
gout2
0
1
gout3
1
2
gout4
2
Donc c'est un seul fscanf qui réclame deux entrées, c'est étrange non ?
Bon ben le problème est finalement résolu !
ça venait de l'espace après le %s dans le fscanf, qui servait à lire dans le fichier à la base mais qui passait mal sur l'entrée clavier, du coup faut modifier un peu la fonction et ajouter aussi la même chose sur les deux autres (sport et loisirs) :
ça venait de l'espace après le %s dans le fscanf, qui servait à lire dans le fichier à la base mais qui passait mal sur l'entrée clavier, du coup faut modifier un peu la fonction et ajouter aussi la même chose sur les deux autres (sport et loisirs) :
void scanmusic(pfiche a, FILE* flot) { int i,c; for (i=0;i<BORNE;i++) { a->music[i]=(char*)malloc(TAILLE*sizeof(char)); fscanf(flot,"%s", a->music[i]); if(flot!=stdin){ if((c=fgetc(flot))==EOF){ ungetc(c,flot); } } } }
En fait après avoir affiché qu'on doive rentrer les gouts musicaux il nous fais rentrer 4 chaines au lieu de 3, ensuite 3 pour les sports et 3 pour les loisirs, mais le hic c'est que le dernier loisir compte pour le scanf du menu, et que dans le fichier le quatrieme gout musical est en fait le premier sport et le 3eme sport le 1er loisir.
Je me doute bien que le probleme doit être lié au buffer, mais j'ai beau potasser mes cours sur le sujet je ne vois pas ce qui fait qu'il me fais ça.
Pour apporter un peu plus de précision par rapport à l'endroit ou ça bug : j'avais testé en mettant un printf("%d",i) dans la boucle for de la fonction scanmusic (entre le malloc et le fscanf) : et à l'execution il ne me met pas de 0 avant le premier scan du gout musical, ensuite il en met un pour le second, un 1 pour le 3eme et un 2 pour le 4eme. On a donc bien une demande d'entrée clavier en trop et je ne vois pas d'ou elle peut venir.
Je me doute bien que le probleme doit être lié au buffer, mais j'ai beau potasser mes cours sur le sujet je ne vois pas ce qui fait qu'il me fais ça.
Pour apporter un peu plus de précision par rapport à l'endroit ou ça bug : j'avais testé en mettant un printf("%d",i) dans la boucle for de la fonction scanmusic (entre le malloc et le fscanf) : et à l'execution il ne me met pas de 0 avant le premier scan du gout musical, ensuite il en met un pour le second, un 1 pour le 3eme et un 2 pour le 4eme. On a donc bien une demande d'entrée clavier en trop et je ne vois pas d'ou elle peut venir.