118 votes

Comment déclarer des chaînes de caractères en C

Quelqu'un peut-il m'expliquer quelle est la différence entre ces lignes de code

char *p = "String";
char p2[] = "String";
char p3[7] = "String";

Dans quel cas dois-je utiliser chacun des éléments ci-dessus ?

30 votes

Le dernier est un dépassement de tampon, donc c'est bien.

3 votes

Votre troisième exemple devrait être p3[6] : vous devez tenir compte du dernier 0

22 votes

@fge : a besoin de 7 en fait.

48voto

fge Points 40850

Ce lien devrait satisfaire votre curiosité.

En gros (en oubliant votre troisième exemple qui est mauvais), la différence entre 1 et 2 est que 1 alloue de l'espace pour un pointeur vers le tableau.

Mais dans le code, vous pouvez les manipuler comme des pointeurs tout de même - seule chose, vous ne pouvez pas réallouer le second.

0 votes

Les gars, avant de mettre en signet le lien que fge a posté, sachez que le site web de la FAQ a été mis à jour comme suit c-faq.com et le lien spécifique posté à ce sujet c-faq.com/aryptr (2.1,2.2) mais sans changements. Juste au cas où.

48voto

obounaim Points 1213

Les chaînes de caractères en C sont représentées comme des tableaux de caractères.

char *p = "String";

Vous déclarez un pointeur qui pointe vers une chaîne de caractères stockée quelque part dans votre programme (la modification de cette chaîne est un comportement non défini) selon le langage de programmation C 2 ed.

char p2[] = "String";

Vous déclarez un tableau de chars initialisé avec la chaîne "String" en laissant au compilateur le soin de compter la taille du tableau.

char p3[5] = "String";

Vous déclarez un tableau de taille 5 et l'initialisez avec "String". C'est une erreur car "String" ne tient pas dans 5 éléments.

char p3[7] = "String"; est la déclaration correcte (' \0 ' est le caractère de fin de chaîne de caractères c).

http://c-faq.com/~scs/cclass/notes/sx8.html

0 votes

Veuillez noter que le lien a été mis à jour pour devenir c-faq.com/charstring/index.html

22voto

littleadv Points 15607

Vous ne devriez pas utiliser le troisième parce qu'il est faux. "String" prend 7 octets, pas 5.

Le premier est un pointeur (il peut être réaffecté à une adresse différente), les deux autres sont déclarés comme des tableaux, et ne peuvent pas être réaffectés à des emplacements mémoire différents (mais leur contenu peut changer, utilisez la fonction const pour éviter cela).

5 votes

char p3[5] = "String"; bien que dangereux, ce n'est pas faux et c'est valable en C (mais pas en C++)

6 votes

@ouah - c'est faux. Il peut passer la compilation, mais il est néanmoins mauvais .

4 votes

Il s'agit d'une définition strictement conforme pour un objet. Un programme strictement conforme n'est pas "mauvais" en termes de C.

7voto

SKM Points 63
char *p = "String";   means pointer to a string type variable.

char p3[5] = "String" ; signifie que vous prédéfinissez la taille du tableau pour qu'il ne comprenne pas plus de 5 éléments. Notez que, pour les chaînes de caractères, le caractère nul " \0 "Donc, cette déclaration donnerait une erreur puisque le nombre d'éléments est de 7, donc il devrait être :

char p3[7]= "String";

1voto

char p3[5] = "String";

Celui-ci ne peut pas être utilisé, car le char n'a qu'un seul symbole et on ne peut pas l'écrire comme ça.

char p2[] = "String";

C'est la déclaration habituelle des chaînes de caractères, dans mon cas, je l'utilise dans la plupart des cas.

char *p = "String";

Il s'agit d'un pointeur ou quelque chose comme ça, je ne sais pas comment ça s'appelle en anglais, utilisé principalement pour travailler avec des classes.

De même, pour les tableaux de chaînes de caractères, vous pouvez utiliser des tableaux à deux dimensions ou des chars.

EX :

char[10][];
char[1] = "string"; // and so on

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X