comment déclarer une structure (un type) en c définit par;
une chaine de caractères
la longueur de cette chaine
taille de l'espace alloué pour contenir la chaine
comment déclarer une structure (un type) en c définit par;
une chaine de caractères
la longueur de cette chaine
taille de l'espace alloué pour contenir la chaine
Bonjour,
Voila comment declarer une structure :
Voila, le typedef permet d'avoir un genre d'alias pour la structure. Lorsque tu declerera une variable du type de ta structure tu pourra ecrire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct ma_struct { char *ma_chaine; int size; }; typedef struct ma_struct mon_type;
La taille (en octets) que prendra ta chaine en memoire sera la meme que sa size puisqu'un char prend un octet (0 a 255).
Code : Sélectionner tout - Visualiser dans une fenêtre à part mon_type ma_variable;
Cordialement,
Neroptik
Mais dans ce cas, machaine doit pointer sur une chaîne de caractères, et non contenir une chaîne de caractères. size contiendra la taille en octets (bytes) du bloc pointé.
Je propose par contre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 typedef struct { char s[50]; size_t longueur, capacite; } st_chaine ; ... st_chaine ch; ch.capacite = 50; /* ou ch.capacite = sizeof(ch.s); */ strcpy(ch.s, "abc"); ch.longueur = 3; /* ou ch.longueur = strlen(ch.s); */
berk !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { char s[50]; size_t longueur, capacite; } st_chaine ;
Et quid si la chaine depasse 50
Pourquoi ne pas garder un pointeur ?
C'est beaucoup plus souple
a l'initialisation on fait un calloc de s d'une taille utille que l'on met dans capacité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { char *s; size_t longueur, capacite; } st_chaine ;
Ensuite s devient dynamique et rien n'empeche de faire un realloc
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
La proposition de melem est bien moins dangereuse :
* moins de risques de segfaults dues à :
* * un oubli d'allocation
* * un free d'un buffer partagé par deux structs alors qu'une des structs l'utilise encore
* modification d'une struct qui entraîne une modification non prévue d'une autre
* fuites de mémoire
Après tout dépend de ce que l'on veut faire, si :
* on a des chaînes de longueur imprévisible
* on veut calculer la mémoire au plus juste
* on a beaucoup de ces structs utilisées dans le programme
* on veut pouvoir partager les chaînes de caractères entre plusieurs structs
Alors ok pour le pointeur et malloc/realloc. Mais c'est pas la solution la plus simple à mettre en oeuvre.
Sinon y'a aussi la solution en C99 de déclarer la struct ainsi (chaîne en fin de struct) :
et de décider de la taille du tableau à l'allocation. C'est un entre deux, moins souple que ta solution olibara, plus que celle de melem, mais qui impose de ne pas s'emmêler les pinceaux avec la taille du tableau imprévisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct une_struct { type un_champ; char ma_chaine[]; }
[Edit] J'oubliais, la solution de melem a l'avantage de permettre de s'affranchir complètement de l'allocation dynamique, suivant le cas... Ça peut être un sacré avantage !
[Edit2] chapines == chaînes; Elle m'énerve cette faute de frappe, elle m'énerve !!!
@huit_six : bien vu. La question venant d'un débutant, il faut savoir donner des réponses accessibles à tout débutant, pas des réponses d'expert à expert. Si l'apprenti fait preuve de plus de curiosité, c'est la seulement qu'il faut l'initier à quelques trucs avancés. C'est une méthode d'enseignement largement utilisée.
Salut Melem
Il voulait avoir
Quand on parle de l'espace alloué il doit y avoir une raisonune chaine de caractères
la longueur de cette chaine
taille de l'espace alloué pour contenir la chaine
Dans ton exemple, définir la capacité ne sert a rien puisqu'elle est implicitement connue dans le sizeof de s
Pire ca complique les chose puisque dans ton exemple il est necessaire de l'assigner en redondance avec le sizeof(s) alors que vous revendiquez la simplicité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct { char s[50]; size_t longueur, capacite; } st_chaine ;
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Il y a un abus de langage dans ce que t'es en train de dire. Alloué ne signifie pas forcément "alloué dynamiquement" ! Si je déclare par exemple une variable char x, alors la taille allouée pour ma variable x est 1 byte. C'est tout.Envoyé par olibara
Ca c'est en partie en vrai, et je ne suis pas contre la solution char * + malloc d'ailleurs. Par contre, je pense que même avec un tableau statique, avoir un champ capacite dans st_chaine ne complique rien du tout car écrire machaine.capacite, c'est quand même plus sympa qu'écrire sizeof(machaine.s) non ?Envoyé par olibara
En fait, le véritable problème est que le sujet n'a pas précisé si on veut avoir un tableau dynamique ou juste un tableau statique. Logiquement, ça devrait être la première sinon le champ capacite n'aurait évidemment pas une réelle raison d'être. On peut aussi cependant croire que c'est juste un mauvais exercice de manipulation de structure, et non un exercice de manipulation des chaînes ...
Certe ! et je suis tres friand de lisibilitémachaine.capacite, c'est quand même plus sympa qu'écrire sizeof(machaine.s) non ?
Neanmoins dans le cadre ou huit_six parlait du risque d'oubli en tout genre, ca nécessite de ne pas oublier d'assigner la capacité et de ne pas se tromper !
avec un sizeof aucun risque
Et on gagne de la place
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager