Je lis this document, il dit:c strncpy ou non nulle fin
char *strncpy(char *destination, const char *source, size_t num);
caractères Copier de chaîne Copies les premiers caractères de
num
source
àdestination
. Si la fin de la chaîne Csource
(qui est signalée par un caractère nul) est trouvée avant que les caractèresnum
aient été copiés,destination
soit complétée avec des zéros jusqu'à ce qu'un total denum
caractères lui ait été écrit.Aucun caractère nul n'est implicitement ajouté à la fin de la destination si la source est plus longue que
num
. Ainsi, dans ce cas,destination
ne doit pas être considéré comme une chaîne C terminée par un caractère nul (la lire en tant que telle débordera).
destination
etsource
ne doit pas se chevaucher (voirmemmove
pour une alternative plus sûre en cas de chevauchement).
Mais je suis confus par cette déclaration:
dans ce cas, la destination ne doit pas être considérée comme une valeur nulle chaîne terminée C (lecture en tant que telle déborderait)
Depuis si num > strlen(source)
, il remplira '\0'
à la fin, '\0'
est en fait un caractère nul (se terminant) dans une chaîne, pourquoi il ne doit pas être considéré comme une chaîne C terminée par un caractère nul?
J'ai écrit ci-dessous code pour vérifier:
char from[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
char to[1024];
for (int i = 0; i < 1024; i++) {
to[i] = 'e';
}
strncpy(to, from, 1024);
printf("from %s\n", from);
Il fonctionne très bien avec la sortie ci-dessous:
from hello
to hello
'strncpy': ne l'utilisez pas. – chqrlie
L'absence d'un '' \ 0'' est où 'strlen (source)> num', donc je pense que vous avez juste un simple malentendu - essayez' strncpy (to, from, 2); 'à la place. –