C ++: strcpy Fonction copies null?
Tout en utilisant les fonctions de manipulation de chaîne specific strcpy
j'ai fait ce petit programme.
char s1[8]="Hellopo";
char s2[4]="sup";
strcpy(s1,s2);
cout<<s1<<endl;
Lorsque j'ai imprimé s1 Il fait juste imprimé "sup". Je m'attendais à imprimer "suplopo".
Alors j'ai fait ce:
cout<<s1+4 << endl;
Imprimer "boa";
Et La sortie de cette: cout<<s1+3<<endl;
avait rien
Donc après avoir réfléchi un peu à ce sujet.
Je suis venu à cette conclusion. Depuis C++ s'arrête outputing la chaîne une fois qu'il atteint le terminateur null. Par conséquent, la valeur null doit avoir été copié dans le strcpy
fonction. Résultant de cette chaîne:
s - u - p - \0 - o - p - o -\0;
Veuillez me dire si cela est correct ou pas. Et si je ne suis pas veuillez me corriger.
Et si vous avez plus d'infos à fournir s'il vous plaît.
source d'informationauteur Mohamed Ahmed Nabil
Vous devez vous connecter pour publier un commentaire.
Votre raisonnement est correct, et aurait facilement pu être confirmé par un décent manuel:
Vous sont corrects. Pour l'effet que vous avez initialement prévu, vous pouvez utiliser
strncopy
.strncopy
copies le terminateur null aussi longtemps que vous le spécifier la longueur de la chaîne qui est en train d'être copié.C'est correct.
http://pubs.opengroup.org/onlinepubs/009695399/functions/strcpy.html
Oui, c'est exact. strcpy comprendra le terminateur null. Il est important que si vous copiez la chaîne à un nouveau bloc de mémoire vous voulez une valeur null par défaut. Je crois que strncpy peut-être ce que vous êtes après, dans ce cas.
Aussi je sais que c'était seulement de tester le code, mais je préfère être prudent dans cette journée et l'âge de l'aide +X décalages dans les cordes... ascii normalement les morsures de personnes dans l'extrémité arrière de l'utf-8/unicode monde que nous vivons aujourd'hui.
À partir de la page de man pour
strcpy
:Votre raisonnement, en ce qui concerne la copie de la caractère de terminaison est correct. La norme C++ (qui est l'ultime spécification pour le langage diffère de C sur cette question (par exemple, C++14 reporte à C99, et C++17 reporte à C11).
La norme C11 a ceci à dire à propos de
strcpy
:Si vous voulais juste remplacer les trois premiers caractères de votre chaîne, vous pouvez utiliser
memcpy()
pour copier un certain nombre de bytes:Garder à l'esprit que ce sera juste copier ces octets et rien de plus. Si
s1
n'est-ce pas déjà une chaîne de caractères d'au moins la longueur des2
il est peu probable de mettre fin à bien 🙂Et juste garder une chose à l'esprit: re votre commentaire "... d'où cette chaîne de caractères: sup\0opo\0".
Qui est pas une chaîne de caractères. Une chaîne de caractères en C (et un héritage chaîne en C++) est définie comme une série de caractères jusqu'à et y compris la première
\0
terminator.Vous pouvez très bien avoir une série de personnages à l'origine (maintenant à la seconde)
\0
mais la chaîne est effectivement plus courte que cela. Cela peut semblent un peu pédant, mais il est important de comprendre les définitions.