Probleme sur type char en c

milou43 Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   -
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);
}
}




A voir également:

3 réponses

ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
bonjour,
au lieu de scanf, utiliser gets(char *) qui recupére la ligne entrée.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   18
 
pourquoi oublier une fonction simple et pratique ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   18
 
so, what about scanf ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   18
 
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   Statut Contributeur Dernière intervention   1 846
 
&_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   Statut Membre Dernière intervention   18
 
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   Statut Membre Dernière intervention  
 
merci je vais essayer.

bonne soirée a toi aussi
0