#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?
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.
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)
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