Comment travailler avec des champs de chaînes dans une struct C?
Je vais avoir du mal à faire une base de données basée sur une liste liée individuellement dans C,
non pas à cause de la liste liée concept, mais plutôt les champs de type chaîne de la struct eux-mêmes.
C'est une affectation en C et pour autant que je sais (je suis novice), C ne reconnaît pas "chaîne" comme un type de données.
C'est ce que mon struct code ressemble à ceci:
typedef struct
{
int number;
string name;
string address;
string birthdate;
char gender;
} patient;
typedef struct llist
{
patient num;
struct llist *next;
} list;
Je pensais faire une structure pour les chaînes elles-mêmes, afin que je puisse les utiliser dans la structure, comme ceci:
typedef struct string
{
char *text;
} *string;
Alors je vais malloc()
chacun d'eux quand il est nécessaire de faire de nouvelles données de type chaîne de caractères (tableau de char).
typedef struct string
{
char *text;
} *string;
int main()
{
int length = 50;
string s = (string) malloc(sizeof string);
s->text = (char *) malloc(len * sizeof char);
strcpy(s->text, patient.name->text);
}
Quelqu'un peut m'aider à comprendre cela?
Merci.
source d'informationauteur fleuracia
Vous devez vous connecter pour publier un commentaire.
Sur les cordes et l'allocation de mémoire:
Une chaîne de caractères en C est juste une séquence de
char
s, de sorte que vous pouvez utiliserchar *
ou unchar
tableau où vous souhaitez utiliser un type de données chaîne:Alors vous avez besoin d'allouer de la mémoire pour la structure elle-même, et pour chacune des chaînes:
Si vous aurez seulement besoin d'un peu de
patient
s, vous pouvez éviter la gestion de la mémoire au détriment d'allouer plus de mémoire que vous avez vraiment besoin:Sur les listes chaînées:
En général, le but d'une liste chaînée est de prouver un accès rapide à une collection ordonnée d'éléments. Si votre
llist
contient un élément appelénum
(qui normalement contient le patient numéro), vous avez besoin d'une structure de données supplémentaires pour tenir le réelpatient
s eux-mêmes, et vous aurez besoin de regarder pour le patient nombre à chaque fois.Au lieu de cela, si vous déclarez
ensuite, chaque élément contient un pointeur direct à un
patient
structure, et vous pouvez accéder aux données comme ceci:Alors que Richard est ce que vous voulez si vous ne voulez aller avec un typedef, je proposerais que ce n'est probablement pas une très bonne idée dans ce cas, vous perdez de vue étant un pointeur, alors que pas gagner quoi que ce soit.
Si vous avez été traiter a a compté chaîne, ou quelque chose avec des fonctionnalités supplémentaires, qui peuvent être différentes, mais j'aimerais vraiment recommander que, dans ce cas, vous venez de vous familiariser avec le "standard" C de la chaîne de mise en œuvre d'un 'char *'...
Vous pouvez simplement utiliser un moyen encore plus simple
typedef
:Ensuite, votre malloc ressemblerait à une habitude malloc:
Cela ne fonctionne pas:
string
fait référence à un pointeur, vous avez besoin de la taille de la structure elle-même:Note de l'absence de cast (conversion de
void*
(malloc
's type de retour) est implicitement réalisée).Aussi, dans votre
main
vous avez l'échelle mondiale benoit xvi a déclarépatient
mais qui ne sont pas initialisés. Essayez:avant de lire-accès à l'un quelconque de ses membres
Aussi,
strcpy
est dangereuse en soi de ne pas avoir de limite de vérification de la copie jusqu'à ce que le premier'\0'
est rencontré, écrit passé, la mémoire allouée si la source est trop long). Utilisationstrncpy
au lieu de cela, où vous pourrez, à moins de spécifier le nombre maximal de caractères copiés -- lisez la documentation pour s'assurer que vous passez la valeur correcte, il est facile de faire un tout-en-un erreur.