La chaîne est plus longue que prévu en C

Voici mon code

#include  #include  int main(){ char pal[8] = "ciaooaic"; char pal1[7] = "ciaoaic"; int lenPal = strlen(pal); int lenPal1 = strlen(pal1); printf("strlen('%s'): %d\n", pal, lenPal); printf("strlen('%s'): %d\n", pal1, lenPal1); return 0; } 

Le problème est que lorsque je lance ce code, le résultat est le suivant:

 strlen('ciaooaicP@'): 11 strlen('ciaoaic'): 7 

La première chaîne a aussi un autre caractère non imprimable entre P et @. Je suis un noob, alors j’ai peut-être manqué quelque chose d’évident. Est-ce que quelqu’un peut m’aider?

modifier:

donnez simplement un espace supplémentaire comme char pal [9] = “ciaooaic”; char pal1 [8] = “ciaoaic”;

Cela fonctionne, mais pourquoi? Je comprends qu’il devrait y avoir un espace pour \ 0, mais “ciaoaic” fonctionne sans lui …

1. Vous ne laissez pas d’espaces pour le terminateur null, car vous les transmettez à strlen() , votre code présente donc un comportement indéfini

 char pal[8] = "ciaooaic"; char pal1[7] = "ciaoaic"; 

Laissez un espace pour '\0' . Déclarer et initialiser comme ça –

 char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic"; 

2. Et strlen() renvoie size_t not int , écrivez comme ceci –

 size_t lenPal = strlen(pal); size_t lenPal1 = strlen(pal1); 

et utilisez le spécificateur %zu pour imprimer ces deux variables.

Vous n’avez pas gardé d’espace pour le caractère final NULL \0 .


Soit augmenter la taille du tableau de 1

 char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic"; 

OU

Ne pas spécifier la longueur du tout

 char pal[] = "ciaooaic"; char pal1[] = "ciaoaic"; 

Les deux réponses ci-dessus sont suffisantes pour résoudre vos doutes. Augmentez la longueur de pal et pal1 de un, car il n’y a pas d’espace pour l’atsortingbution du caractère nul (‘\ 0’) à la fin. Cependant, il existe un petit truc pour imprimer le caractère non nul à l’aide de printf

 printf("strlen('%.*s'): %d\n",8, pal, lenPal); printf("strlen('%.*s'): %d\n",7, pal1, lenPal1); 

Lien pour l’astuce ci-dessus: BRILLANT