Listes chaînées
Fermé
axelvdk
-
12 févr. 2013 à 18:49
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 14 févr. 2013 à 02:04
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 14 févr. 2013 à 02:04
A voir également:
- Listes chaînées
- Listes déroulantes en cascade excel - Guide
- Faire des listes déroulantes excel - Guide
- Listes de diffusion whatsapp - Guide
- Fusionner deux listes excel - Guide
- Listes courses - Télécharger - Outils professionnels
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
14 févr. 2013 à 02:04
14 févr. 2013 à 02:04
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