2011-09-23 2 views
2

Je suis vraiment frustré de la fonction strncpy. Je l'ai fait quelque chose comme ceci:c copie avec strncpy

char *md5S; //which has been assign with values, its length is 44 
char final[32]; 
strncpy(final,md5S,32); 

mais en quelque sorte la longueur de char final[] est devenu plus de 32 après.
Que dois-je faire ici?

Répondre

8

Vous avez oublié de laisser la place pour le caractère nul

char final[33]; 
strncpy(final,md5S,32); 
final[32] = '\0'; 
+0

oh, à droite, je vous remercie beaucoup, ne peut pas croire que j'ai passé tellement de temps avec elle – SamChen

2

Si votre tampon de sortie n'est pas assez grand pour copier la totalité de la chaîne source et son NUL arrière puis la chaîne de sortie ne sera pas mis fin à NUL.

Dans votre cas, le MD5 est de 33 octets dont le NUL, de sorte que le NUL n'est pas copié. Lorsque vous lisez la chaîne, vous lisez après la fin de votre tampon.

Faire 33 derniers octets, et ajoutez toujours un NUL au dernier caractère de la destination lors de l'utilisation strncpy.

int n = 32; 
char *src = "some really really long, more than 32 chars, string." 
char dst[n+1]; 

strncpy(dst, src, n); 
dst[n] = '\0'; 
5

strncpy n'a pas NUL-terminer la chaîne copié si la chaîne source est aussi longue ou plus longue que n caractères. Si vous y avez accès, vous pouvez utiliser strlcpy, qui NUL fin pour vous.

Pour ce faire, à la place:

strncpy(dst, src, dstlen - 1); 
dst[dstlen - 1] = '\0'; 

OU

strlcpy(dst, src, dstlen); 

où, pour un tableau de caractères, dstlen = sizeof(dst).