Comment correctement attribuer une nouvelle valeur de chaîne?
J'essaie de comprendre comment résoudre ce problème trivial en C, dans la plus propre/manière la plus sûre. Voici mon exemple:
#include <stdio.h>
int main(int argc, char *argv[])
{
typedef struct
{
char name[20];
char surname[20];
int unsigned age;
} person;
//Here i can pass strings as values...how does it works?
person p = {"John", "Doe",30};
printf("Name: %s; Age: %d\n",p.name,p.age);
//This works as expected...
p.age = 25;
//...but the same approach doesn't work with a string
p.name = "Jane";
printf("Name: %s; Age: %d\n",p.name,p.age);
return 1;
}
Le compilateur de l'erreur est:
principal.c: In function ‘main’: main.c:18:
error: incompatible types de
l'attribution to type ‘char[20]’ from type
‘char *’
Je comprends que C (pas C++) n'a pas de type Chaîne de caractères et utilise à la place des tableaux de caractères, donc, une autre façon de le faire était de modifier l'exemple struct pour contenir des pointeurs de caractères:
#include <stdio.h>
int main(int argc, char *argv[])
{
typedef struct
{
char *name;
char *surname;
int unsigned age;
} person;
person p = {"John", "Doe",30};
printf("Name: %s; Age: %d\n",p.name,p.age);
p.age = 25;
p.name = "Jane";
printf("Name: %s; Age: %d\n",p.name,p.age);
return 1;
}
Cela fonctionne comme prévu, mais je me demande si il y a une meilleure façon de le faire. Merci.
- Si nous déclarons struct dans
main()
, personne ne peut être l'accès à l'intérieur. Essayez de déplacer hors de la principale de l'utiliser comme global
Vous devez vous connecter pour publier un commentaire.
Le premier exemple ne fonctionne pas parce que vous ne pouvez pas affecter des valeurs à des tableaux - tableaux (en quelque sorte) comme const pointeurs à cet égard. Ce que vous pouvez faire est de copier une nouvelle valeur dans le tableau:
Des tableaux de Char sont beaux à utiliser si vous connaissez la taille maximale de la chaîne à l'avance, par exemple dans le premier exemple, vous êtes sûr à 100% que le nom sera adaptée à 19 caractères (pas 20 parce que d'un caractère est toujours nécessaire pour stocker la résiliation de la valeur zéro).
À l'inverse, les pointeurs sont mieux si vous ne connaissez pas le maximum possible de la taille de votre chaîne, et/ou vous souhaitez optimiser votre utilisation de la mémoire, par exemple, éviter de se réservant de 512 caractères pour le nom de "Jean". Cependant, avec les conseils dont vous avez besoin pour allouer dynamiquement de la mémoire tampon elles point, et libre quand elle n'est pas plus nécessaire, pour éviter les fuites de mémoire.
Mise à jour: exemple de alloués dynamiquement tampons (à l'aide de la structure de la définition de votre 2ème exemple):
Pense que des chaînes comme abstraite des objets et des tableaux de char comme des conteneurs. La chaîne peut être de toute taille, mais le conteneur doit être d'au moins 1 de plus que la longueur de la chaîne (pour garder le terminateur null).
C a très peu de syntaxe de soutien pour les chaînes. Il n'y a pas de chaîne opérateurs (seulement char-array et char-les opérateurs de pointeur). Vous ne pouvez pas affecter des chaînes.
Mais vous pouvez appeler des fonctions pour aider à atteindre ce que vous voulez.
La
strncpy()
fonction peut être utilisée ici. Pour un maximum de sécurité, je suggère de suivre ce modèle:Également jeter un oeil à la
strncat()
etmemcpy()
fonctions.Les deux structures sont différentes. Lors de l'initialisation de la première structure, environ 40 octets de mémoire sont alloués. Lors de l'initialisation de la deuxième structure, environ 10 bytesof de mémoire sont alloués. (Montant réel est dépendants de l'architecture)
Vous pouvez utiliser les littéraux de chaîne (chaîne de caractères constantes) à initalize des tableaux de caractères. C'est pourquoi
travaux dans le premier exemple.
Vous ne pouvez pas céder (dans le sens classique du terme) une chaîne de caractères en C.
Les littéraux de chaîne que vous avez ("John") sont chargés en mémoire lorsque votre code s'exécute. Lorsque vous initialiser un tableau avec l'un de ces littéraux, puis la copie de la chaîne dans un nouvel emplacement de la mémoire. Dans ton deuxième exemple, vous vous contentez de copier le pointeur à (lieu de) la chaîne de caractères littérale. Faire quelque chose comme:
peut causer de la compilation ou de l'exécution des erreurs (je ne suis pas sûr.) C'est une mauvaise idée parce que vous êtes en train de modifier la chaîne "Bonjour" qui, par exemple un microcontrôleur, pourrait être situé dans la mémoire en lecture seule.