web-dev-qa-db-fra.com

Sizeof vs Strlen

#include "stdio.h"
#include "string.h"

main()
{

    char string[] = "october"; // october is 7 letters

    strcpy(string, "september"); // september is 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));

    return 0;
}

Sortie:

la taille de septembre est de 8 et la longueur est de 9

Y a-t-il un problème avec ma syntaxe ou quoi?

40
beparas

sizeof et strlen() font des choses différentes. Dans ce cas, votre déclaration

char string[] = "october";

est le même que

char string[8] = "october";

donc le compilateur peut dire que la taille de string est 8. Il le fait au moment de la compilation.

Cependant, strlen() compte le nombre de caractères de la chaîne au moment de l'exécution. Ainsi, après avoir appelé strcpy(), string contient désormais "septembre". strlen() compte les caractères et en trouve 9. Notez que vous n'avez pas alloué suffisamment d'espace pour que string contienne "septembre". Il s'agit d'un comportement indéfini.

40
Sean

La sortie est correcte car

la première taille de chaîne d'instruction a été allouée par le compilateur qui est 7 + 1 (octobre est 7 octets et 1 octet pour le terminateur nul au moment de la compilation)

Deuxième instruction: vous copiez septembre (chaîne de 9 octets à 8 octets);

là pour vous a obtenu la taille de septembre comme 8 octets (toujours strlen() ne fonctionnera pas pour septembre il n'a pas de caractère nul)

2
Praveen.thota

Votre tableau de destination est de 8 octets (longueur "octobre" plus\0) et vous voulez mettre 9 caractères dans ce tableau.

man strcpy dit: Si la chaîne de destination d'un strcpy () n'est pas assez grande, alors tout peut arriver.

S'il vous plaît, dites-moi ce que vous voulez vraiment faire, car cela sent mauvais à long terme

1
ola1olsson