Comment attribuer correctement une nouvelle valeur de chaîne?

J'essaie de comprendre comment résoudre ce problème trivial dans C, le plus propre/manière 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;
}


L'erreur du compilateur est la suivante:

main.c: en fonction ' main’: main.c:18:
Erreur: types incompatibles lorsque
Affectation de type ' char[20] ' De type
‘char *’

je comprends que C /mais non C++/ Il n'a pas de type de chaîne et utilise plutôt des tableaux de caractères, de sorte que cette façon de le faire était de modifier la structure de l'exemple du stockage des symboles:


#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 s'il y a la meilleure façon de le faire. Merci.
</stdio.h></stdio.h>
Invité:

Agathe

Confirmation de:

Le premier exemple ne fonctionne pas, car vous ne pouvez pas attribuer de valeurs aux tableaux - Les tableaux travaillent /Comme/ comme des signes const À cet égard. Cependant, vous pouvez copier une nouvelle valeur dans un tableau:


strcpy/p.name, "Jane"/;


Les tableaux de symboles peuvent être utilisés si vous connaissez la taille maximale de la chaîne à l'avance, par exemple, dans le premier exemple, vous êtes sûr que le nom correspondra au nom. 19 Symboles /mais non 20, Parce qu'un caractère est toujours nécessaire pour stocker la valeur zéro finale./.

Et inversement, les pointeurs préférons utiliser si vous ne connaissez pas la taille maximale possible de la ligne et / Ou souhaitez optimiser l'utilisation de la mémoire, par exemple, ne pas réserver 512 Symboles pour le nom "John". Cependant, en utilisant les pointeurs, vous devez mettre en évidence de manière dynamique le tampon sur lequel ils l'indiquent et le libèrent lorsqu'il n'est plus nécessaire pour éviter les fuites de mémoire.

Mettre à jour:

Exemple de tampons alloués dynamiquement /Utilisation de la définition de la structure dans la 2e exemple/:


char* firstName = "Johnnie";
char* surname = "B. Goode";
person p;

p.name = malloc/strlen/firstName/ + 1/;
p.surname = malloc/strlen/surname/ + 1/;

p.age = 25;
strcpy/p.name, firstName/;
strcpy/p.surname, surname/;

printf/"Name: %s; Age: %d\n",p.name,p.age/;

free/p.surname/;
free/p.name/;

Cyprien

Confirmation de:

Lisez les chaînes avec des objets abstraits et des tableaux de caractères de conteneur. La chaîne peut être n'importe quelle taille, mais le conteneur doit être au moins 1 Plus longueur de chaîne /Contenir un terminateur null/.

C Il a très peu de soutien syntaxique pour les chaînes. Il n'y a pas d'opérateurs de cordes ici. /Seuls opérateurs char-array et char-pointer/. Vous ne pouvez pas attribuer des chaînes.

Mais vous pouvez appeler des fonctions pour aider à atteindre le choix souhaité.

Ici vous pouvez utiliser la fonction
strncpy//

. Pour une sécurité maximale, je suggère de suivre ce schéma:


strncpy/p.name, "Jane", 19/;
p.name[19] = '\0'; //add null terminator just in case


Regardez également les fonctions.
strncat//

et
memcpy//

.

Frederic

Confirmation de:

Ces deux structures sont différentes. Lors de l'initialisation de la première structure se distingue sur 40 octet mémoire. Lors de l'initialisation de la deuxième structure se distingue sur 10 octet mémoire. /Le montant réel dépend de l'architecture/

Vous pouvez utiliser des littéraux de chaîne. /Constantes de cordes/ Pour initialiser les matrices symboliques. C'est pourquoi

une personne p = {"John", "Doe",30};

Fonctionne dans le premier exemple.

Vous ne pouvez pas attribuer /Dans le sens habituel/ Ligne B. C.

Littéraux strings que vous avez /"John"/, Chargement dans la mémoire lors de l'exécution de votre code. Lorsque vous initialisez le tableau avec l'un de ces littéraux, la chaîne est copiée dans une nouvelle cellule de mémoire. Dans le deuxième exemple, vous copiez simplement le pointeur sur /Emplacement/ String littéral. Faire quelque chose comme:


char* string = "Hello";
*string = 'C'


peut entraîner des erreurs de compilation ou d'exécution /Je ne suis pas sûr./ C'est une mauvaise idée parce que vous changez la ligne littérale "Hello", Ce qui, par exemple, sur un microcontrôleur peut être positionné uniquement pour la lecture.

Pour répondre aux questions, connectez-vous ou registre