A voir également:
- Listes chaînées
- Listes déroulantes excel - Guide
- Listes déroulantes en cascade excel - Guide
- Listes courses - Télécharger - Outils professionnels
- Listes whatsapp - Guide
- M3u listes ✓ - Forum Téléviseurs
1 réponse
En fait le problème c'est que je pense que gets va s'arrêter au premier espace rencontré. L'autre problème c'est que si ton prénom ou ton nom font plus de 10/15 caractères ils vont débordés de leur zone mémoire et écraser d'autres zones mémoire.
Par exemple suppose que dans ta structure le prénom soit stocké sur 10 octets, suivi du prénom sur 15 octets.
- Supposons que ce soit "Toto" (donc 'T' 'o' 't' 'o' '\0'.).
- La libc lit du texte jusqu'à rencontrer le caractère '\0'.
- Jusque là tout va bien, si j'écris le nom de famille, je vais bien écrire "Toto".
Maintenant supposons que je mémorise le prénom, et que, pas de chance, ce prénom soit long, par exemple "Jean-Philippe", le 10 octets correspond au 2e "i" de "Philippe" donc je vais écrire "ppe" par dessus "Toto". Ainsi, quand je vais écrire
- le nom, ça va écrire "ppeo" (vu que "Tot" s'est fait écraser)
- le prénom, ça va écrire "Jean-Philippeo"
Bref, tout ça pour dire que quand tu lis une chaîne de caractère, il faut prévoir un gros buffer (mettons 200 chars), regarder la longueur de la chaîne avec strnlen, et ainsi tu seras exactement comment allouer tes deux char * dans ton maillon de liste. Par exemple si ton prénom fait n lettres :
char *prenom = malloc((n + 1) * sizeof(char)); // n lettres + '\0'
Il ne restera plus qu'à les copier (avec strncpy) de ton buffer vers ton maillon de liste.
https://linux.die.net/man/3/strnlen
https://linux.die.net/man/3/strcpy
Ce qui donne :
Bonne chance
Par exemple suppose que dans ta structure le prénom soit stocké sur 10 octets, suivi du prénom sur 15 octets.
- Supposons que ce soit "Toto" (donc 'T' 'o' 't' 'o' '\0'.).
- La libc lit du texte jusqu'à rencontrer le caractère '\0'.
- Jusque là tout va bien, si j'écris le nom de famille, je vais bien écrire "Toto".
Maintenant supposons que je mémorise le prénom, et que, pas de chance, ce prénom soit long, par exemple "Jean-Philippe", le 10 octets correspond au 2e "i" de "Philippe" donc je vais écrire "ppe" par dessus "Toto". Ainsi, quand je vais écrire
- le nom, ça va écrire "ppeo" (vu que "Tot" s'est fait écraser)
- le prénom, ça va écrire "Jean-Philippeo"
Bref, tout ça pour dire que quand tu lis une chaîne de caractère, il faut prévoir un gros buffer (mettons 200 chars), regarder la longueur de la chaîne avec strnlen, et ainsi tu seras exactement comment allouer tes deux char * dans ton maillon de liste. Par exemple si ton prénom fait n lettres :
char *prenom = malloc((n + 1) * sizeof(char)); // n lettres + '\0'
Il ne restera plus qu'à les copier (avec strncpy) de ton buffer vers ton maillon de liste.
https://linux.die.net/man/3/strnlen
https://linux.die.net/man/3/strcpy
#include <string.h> #include <stdio.h> #include <stdlib.h> #define BUF_SIZE 200 struct test { char *prenom; char *nom; }; struct test * test_init(const char * prenom, const char * nom) { size_t n; struct test * t = malloc(sizeof(struct test)); n = strnlen(prenom, BUF_SIZE); t->prenom = malloc((n + 1) * sizeof(char)); strcpy(t->prenom, prenom); n = strnlen(nom, BUF_SIZE); t->nom = malloc((n + 1) * sizeof(char)); strcpy(t->nom, nom); return t; } void test_print(const struct test * t) { printf("prenom = %s nom = %s\n", t->prenom, t->nom); } int main() { char prenom[BUF_SIZE]; char nom[BUF_SIZE]; printf("prenom ?\n"); scanf("%s", prenom); printf("nom ?\n"); scanf("%s", nom); struct test * t = test_init(prenom, nom); test_print(t); return 0; }
Ce qui donne :
prenom ? Jean-Philippe nom ? Plop prenom = Jean-Philippe nom = Plop
Bonne chance