Probleme sur type char en c

Fermé
milou43 Messages postés 13 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 2 juin 2011 - 11 oct. 2010 à 18:32
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 - 12 oct. 2010 à 00:56
Bonjour,
je suis en train de faire un programme de gestion d'une classe d'élève en c. pour cela j'ai fait une structure avec a l'intérieur la variable avis ou l'utilisateur est censé saisir une phrase, le problème c'est que je me suis aperçu que "char" s'arrête au niveau des espaces. je voulais donc savoir s'il existait quelque chose qui puisse solutionner mon probleme. j'espère que j'ai été assez clair sinn dsl... merci d'avance.
je vous mets ci dessous un partie de mon code :

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<time.h>
#include<windows.h>
#define Imax 10




struct Personne
{
char nom[20];
char prenom[20];
float moyenne;
char avis[100];
};


/*Prototypes fonctions et procédures de l'algorithme */
int Menu();
void AjoutEleve (Personne _eleve[Imax], int *nbrEleve );
.....

int i;
int Choix;
float Moy;
int nbrEleve;

...

/* Procédure AjoutEleve */
void AjoutEleve (Personne _eleve[Imax], int *nbrEleve )
{
int i;

printf("Combien voulez-vous ajouter d'eleve\n\n");
scanf("%d", &*nbrEleve);

for(i=1;i<=*nbrEleve;i++)
{
printf("\neleve %d\n", i);

printf(" Indiquez son nom\n\n");
scanf("%s", &_eleve[i].nom);

printf(" Indiquez son prenom\n\n");
scanf("%s", &_eleve[i].prenom);

printf(" Indiquez sa moyenne de l'année\n\n");
scanf("%f", &_eleve[i].moyenne);

printf(" Veuillez formuler votre avis sur l'eleve\n\n");
scanf("%s", &_eleve[i].avis);
}
}




3 réponses

ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
11 oct. 2010 à 18:41
bonjour,
au lieu de scanf, utiliser gets(char *) qui recupére la ligne entrée.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
11 oct. 2010 à 22:46
Non pas de gets, c'est une fonction à oublier.
Il vaut mieux utiliser fgets : char *fgets (char *s, int size, FILE *stream);

Cdlt,
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
12 oct. 2010 à 00:22
pourquoi oublier une fonction simple et pratique ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
12 oct. 2010 à 00:25
Car c'est une fonction très dangereuse. Elle permet à l'utilisateur de taper une chaîne aussi long qu'il veut et donc à récrire les bytes de la pile. Avec un peu d'astuce, on détourne facilement le programme. Avec fgets, on impose à l'utilisateur une longueur maximale.
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
12 oct. 2010 à 00:34
so, what about scanf ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
12 oct. 2010 à 00:49
scanf est une fonction beaucoup plus complexe qu'on le pense.
Si chaine est défini comme char chaine[255] alors scanf("%s",chaine) est à éviter au même titre que gets(chaine).
Il faudrait utiliser scanf("254s",chaine)
C'est pour ça qu'on décommande l'utilisation de scanf pour les chaînes de caractère quand on débute et qu'on recommande fgets. Après, avec fgets, il ne faut pas non plus oublier de vider le buffer clavier s'il le faut.
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
11 oct. 2010 à 18:52
quelques petites remarques sur le style:

- "&*nbrEleve" est équivalent à "nbrEleve" qui est un pointeur sur un int
- "&_eleve[i]." peut s'écrire "_eleve[i]->" qui est plus habituel.
- tester "*nbrEleve "par rapport à "Imax" pour éviter un dépassement de tableau
- en C, les indices d'un tableau de dim n vont de 0 à n-1.

bonne soirée
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
11 oct. 2010 à 22:50
&_eleve[i]." peut s'écrire "_eleve[i]->" qui est plus habituel.
Non. _eleve[i]-> signifie *_eleve[i].

Cdlt,
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
12 oct. 2010 à 00:14
oups, autant pour moi.
de toute façon &_eleve[i] ne doit pas se compiler , _eleve[i]. (ou pourquoi pas &_eleve[i]->) oui
0
milou43 Messages postés 13 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 2 juin 2011
11 oct. 2010 à 18:56
merci je vais essayer.

bonne soirée a toi aussi
0