60 votes

Que signifie le symbole \ 0 dans une chaîne C?

Considérons le code suivant:

 char str[]= "Hello\0";
 

Quelle est la longueur du tableau de str et avec combien de 0 il se termine?

106voto

bdonlan Points 90068

sizeof str 7 - cinq octets pour les caractères "Hello", plus explicite NUL de terminaison, en plus de l'implicite NUL de terminaison.

strlen(str) 5 - les cinq "Bonjour" octets seulement.

La clé ici est que l'implicite nul de terminaison est toujours ajoutée, même si la chaîne de caractères littérale arrive juste à la fin, avec \0. Bien sûr, strlen seulement s'arrête à la première \0 - ça ne peut pas faire la différence.

Il existe une exception à l'implicite NUL de terminaison de la règle - si vous spécifiez explicitement la taille de la matrice, la chaîne sera tronqué:

char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)

C'est, cependant, rarement utile, et sujettes à miscalculating la longueur de la corde et de se retrouver avec un sans terminaison de chaîne. Il est également interdit en C++.

12voto

SiegeX Points 32614

La longueur du tableau est de 7, NUL caractère \0 encore considérée comme un caractère et la chaîne est encore arrêté avec un implicite \0

Voir ce lien pour voir un exemple

Notez que vous l'avez déclaré, str comme char str[6]= "Hello\0"; de la longueur serait de 6 en raison de l'implicite NUL n'est ajoutée que si elle peut s'adapter (qui ne peut pas dans cet exemple).

§ 6.7.8/p14
Un tableau de type de caractère peut être initialisé par un littéral de chaîne de caractères, éventuellement entre accolades. Sucessive les caractères de la chaîne de caractères littéral (y compris la résiliation de caractère null si il ya de la place ou si le tableau est de taille inconnue) initialiser les éléments du tableau.

Exemples

char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */
char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */
char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */

5voto

Frapper mon habitude solo de batterie de VIENS de l'ESSAYER, voici comment vous pouvez répondre à des questions comme ça à l'avenir:

$ cat junk.c
#include <stdio.h>

char* string = "Hello\0";

int main(int argv, char** argc)
{
    printf("-->%s<--\n", string);
}
$ gcc -S junk.c
$ cat junk.s

... eliding les parties inutiles ...

.LC0:
    .string "Hello"
    .string ""

...

.LC1:
    .string "-->%s<--\n"

...

Noter comment la chaîne que j'ai utilisé pour printf est juste "-->%s<---\n" alors que la chaîne globale est en deux parties: "Hello" et "". L'assembleur GNU met aussi fin à chaînes avec un implicite NUL personnage, donc le fait que la première chaîne (.LC0) est en ces deux parties indique qu'il y a deux NULs. La chaîne est donc de 7 octets de long. En général, si vous voulez vraiment savoir ce que votre compilateur fait avec un certain morceau de code, l'isoler dans un faux exemple comme ça et de voir ce qu'il fait à l'aide de -S (pour GNU -- MSVC est un indicateur trop pour l'assembleur de sortie mais je ne sais pas il de la main gauche). Vous apprendrez beaucoup de choses sur la façon dont votre code fonctionne (ou ne fonctionne pas comme le cas peut être) et vous obtiendrez une réponse rapidement qui est garanti à 100% pour faire correspondre les outils et l'environnement dans lequel vous travaillez.

3voto

Fred Nurk Points 8927

Quelle est la longueur du tableau de str et avec combien de 0 il se termine?

Découvrons-le:

 int main() {
  char str[] = "Hello\0";
  int length = sizeof str / sizeof str[0];
  // "sizeof array" is the bytes for the whole array (must use a real array, not
  // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used)
  // to get the number of items in the array
  printf("array length: %d\n", length);
  printf("last 3 bytes: %02x %02x %02x\n",
         str[length - 3], str[length - 2], str[length - 1]);
  return 0;
}
 

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