Se connecter / S'enregistrer

Résolu En Langage C, comment faire pour que la saisie de valeur s'effectue sans interruption?

Solutions (2)
Tags :
  • Programmation
|
Bonjour,

Pouvez-vous m'aider svp?
En fait, dans une structure, pourquoi faut-il que les variables de même type soit contiguës entre elles pour que la saisie de valeur s'effectue sans interruption?
Ex :
struct personne{
int numero;
int naissance;
char* nom;
char* adresse;
};

Dans le cas où je mets les variables suivant un ordre où les types identiques ne sont pas contigus entre eux, alors la saisie de valeur s'interrompt à la rencontre d'une variable de caractère ou de chaîne de caractères.
Ex :
struct personne{
int numero;
char* nom;
int naissance;
char* adresse;
};

Merci de votre collaboration.
  • Meuniers a édité ce message
  • Alain471 a édité ce message
Contenus similaires
Meilleure solution
partage
, Maître Yoda |
Alors, je pense que tu n'alloues pas de mémoire pour tes chaines de caractère du coup dans le premier cas. Le programme réserve 2 cases en mémoire pour les deux entiers. Puis il colle les chaines de caractère a l’arrache dans la mémoire à la suite. ce qui fait que ça passe parfois.

Dans le second cas tu réserves dans un premier temps une case pour un entier. puis un pointeur pour ta chaine, puis un entier, puis un second pointeur. Si tu écris dans la mémoire dans la première chaine il va merder car il va rencontrer l'entier juste a coté.

Pour que ton code sois correcte dans les deux cas, il faut que tu alloues de la mémoire à tes pointeurs. En C on peut pas se permettre de laisser faire la mémoire ce qu'elle veut, si non ça fini par faire de la grosse daube.

Utilises malloc pour ça.

personne.nom = malloc(sizeof(char)*nb_caracteres);
personne.adresse = malloc(sizeof(char)*nb_caracteres);

http://www.cplusplus.com/reference/clibrary/cstdlib/mal...

Attention pour "personne.adresse" scanf ne permet pas de prendre des espaces. utilises plutôt fgets (il me semble que cette fonction digère les espaces).

http://www.cplusplus.com/reference/clibrary/cstdio/fget...

il faudra libérer la mémoire allouée a la fin de ton programme.

http://www.cplusplus.com/reference/clibrary/cstdlib/fre...

En gros a la va-vite j'ai :

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. typedef struct personne_s
  5. {
  6. int numero;
  7. char* nom;
  8. int naissance;
  9. char* adresse;
  10. }personne_t;
  11.  
  12. int main()
  13. {
  14. personne_t personne1;
  15.  
  16. personne1.nom = malloc(sizeof(char)*20);
  17. personne1.adresse = malloc(sizeof(char)*20);
  18.  
  19. personne1.numero = 1;
  20. scanf("%i", &personne1.naissance);
  21.  
  22. scanf("%s", personne1.nom);
  23. personne1.adresse = "20ruedetareum";
  24.  
  25. printf("test : %i %i %s %s\n", personne1.numero, personne1.naissance, personne1.nom, personne1.adresse);
  26.  
  27. free(personne1.nom);
  28. free(personne1.adresse);
  29.  
  30. return EXIT_SUCCESS;
  31. }


Qui marche impec' mais qui est pas super bien propre.
l'idéal ce serait d'avoir une fonction d'initialisation, une d’assignation, une d'affichage et une de suppression.
  • andrelec1 a sélectionné cette solution comme la meilleure réponse
  • leey a édité ce message
  • leey a édité ce message
  • leey a édité ce message
  • leey a édité ce message
  • Commenter cette solution |
Score
0
òh
òi
|
L'interruption surviendrait je suppose à cause d'un défaut de scanf....
Il faudrait après chaque saisie ou on utilise scanf d'appliquer la fonction suivante:

fflush(stdin)...
A noter que ce n'est pas une facon tres propre de faire...
Puisque, le code ne sera pas portable... Ca marche generalement quand on compile sur windows mais si on va sur Linux ca ne va pas marcher.

Donc pour rendre le code portable on peut utiliser getchar() qui lui ne prend aucun argument.
Afin de debarrasser le buffer du caractere '\0' laisser par scanf lorsqu'on valide avec Enter

un exemple:

int main{
scanf("%d",&variable);fflush(stdin);ou getchar();
gets(la_variable_de_type_chaine);
return 0;
}
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS