web-dev-qa-db-fra.com

Le tableau de char * doit se terminer par '\ 0' ou "\ 0"?

Disons que nous avons un tableau de pointeurs de caractères

char* array[] = { "abc", "def" };

Maintenant, que faut-il mettre à la fin?

char* array[] = { "abc", "def", '\0' };

ou

char* array[] = { "abc", "def", "\0" };

Cependant, les deux fonctionnent. Il suffit de mettre la condition pour vérifier la fin en conséquence

comme

array[ index ] != '\0';

ou

array[ index ] != "\0";

Ma question est laquelle est la meilleure façon? Lequel est utilisé par la plupart des programmeurs?

Modifier

La plupart des réponses disent que NULL est meilleur que "\ 0" et "\ 0". Mais j'ai toujours pensé que

NULL est identique à '\ 0' qui est identique à 0x0 ou 0

Est-ce faux?

15
Andrew-Dufresne

Je terminerais avec NULL. Pourquoi? Parce que vous ne pouvez faire ni l'un ni l'autre:

array[index] == '\0'
array[index] == "\0"

Le premier compare un char * À un char, ce qui est pas ce que vous voulez. Vous devez faire ceci:

array[index][0] == '\0'

Le second ne fonctionne même pas. Vous comparez un char * À un char *, Oui, mais cette comparaison n'a aucun sens. Il passe si les deux pointeurs pointent vers le même morceau de mémoire. Vous ne pouvez pas utiliser == Pour comparer deux chaînes, vous devez utiliser la fonction strcmp(), car C n'a pas de support intégré pour les chaînes en dehors de quelques-unes (et je veux dire peu) subtilités syntaxiques. Attendu que:

array[index] == NULL

Fonctionne très bien et transmet votre point.

28
Chris Lutz

Selon la spécification C99,

  • NULL se développe en une constante de pointeur nulle, ce qui n'est pas obligatoire, mais est généralement de type void *
  • '\0' Est une constante de caractère; les constantes de caractères sont de type int, c'est donc l'équivalent de plain 0
  • "\0" Est un littéral de chaîne terminé par un caractère nul et équivalent au littéral composé (char [2]){ 0, 0 }

NULL, '\0' et 0 sont tous des constantes de pointeur nul, donc ils donneront tous des pointeurs nuls lors de la conversion, tandis que "\0" donnera un [non nul] char * (Qui doit être traité comme const car la modification n'est pas définie); comme ce pointeur peut être différent pour chaque occurrence du littéral, il ne peut pas être utilisé comme valeur sentinelle.

Bien que vous puissiez utiliser n'importe quelle expression de constante entière de valeur 0 Comme constante de pointeur nul (par exemple '\0' Ou sizeof foo - sizeof foo + (int)0.0), vous devez utiliser NULL pour faire vos intentions sont claires.

7
Christoph

Parmi ces deux, le premier est une erreur de type: '\ 0' est un caractère, pas un pointeur. Le compilateur l'accepte toujours car il peut le convertir en pointeur.

Le second "ne fonctionne" que par coïncidence. "\ 0" est une chaîne littérale de deux caractères. Si ceux-ci se produisent à plusieurs endroits dans le fichier source, le compilateur peut, mais pas nécessairement, les rendre identiques.

Donc, la bonne façon d'écrire le premier est

char* array[] = { "abc", "def", NULL };

et vous testez pour array[index]==NULL. La bonne façon de tester le second est array[index][0]=='\0'; vous pouvez également déposer le '\ 0' dans la chaîne (c'est-à-dire l'épeler comme "") car cela inclura déjà un octet nul.

6
Martin v. Löwis

Eh bien, techniquement '\0' est un caractère tandis que "\0" est une chaîne, donc si vous recherchez le caractère de fin nul, le premier est correct. Cependant, comme Chris Lutz souligne dans sa réponse , votre comparaison ne fonctionnera pas dans sa forme actuelle.

1
ChrisF

La terminaison nulle est un mauvais modèle de conception qu'il vaut mieux laisser dans les livres d'histoire. Il y a encore beaucoup d'inertie derrière les cordes en C, donc cela ne peut pas être évité là-bas. Mais il n'y a aucune raison de l'utiliser dans l'exemple du PO.

N'utilisez pas de terminateur et utilisez sizeof (array)/sizeof (array [0]) pour obtenir le nombre d'éléments.

0
Alan

La terminaison d'un tableau de caractères avec un caractère nul n'est qu'une convention qui concerne spécifiquement les chaînes en C. Vous avez affaire à quelque chose de complètement différent - un tableau de pointeurs de caractères - donc cela n'a vraiment aucun rapport avec la convention pour C cordes. Bien sûr, vous pouvez choisir de le terminer avec un pointeur nul; cela pourrait peut-être être votre convention pour les tableaux de pointeurs. Il existe d'autres façons de procéder. Vous ne pouvez pas demander aux gens comment cela "devrait" fonctionner, car vous supposez une convention qui n'existe pas.

0
newacct