Probleme sur type char en c

milou43 Messages postés 15 Statut Membre -  
ydurce Messages postés 81 Statut Membre -
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

  1. ydurce Messages postés 81 Statut Membre 18
     
    bonjour,
    au lieu de scanf, utiliser gets(char *) qui recupére la ligne entrée.
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non pas de gets, c'est une fonction à oublier.
      Il vaut mieux utiliser fgets : char *fgets (char *s, int size, FILE *stream);

      Cdlt,
      0
    2. ydurce Messages postés 81 Statut Membre 18
       
      pourquoi oublier une fonction simple et pratique ?
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    4. ydurce Messages postés 81 Statut Membre 18
       
      so, what about scanf ?
      0
    5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  2. ydurce Messages postés 81 Statut Membre 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      &_eleve[i]." peut s'écrire "_eleve[i]->" qui est plus habituel.
      Non. _eleve[i]-> signifie *_eleve[i].

      Cdlt,
      0
    2. ydurce Messages postés 81 Statut Membre 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
  3. milou43 Messages postés 15 Statut Membre
     
    merci je vais essayer.

    bonne soirée a toi aussi
    0