首页 > 解决方案 > 如何正确使用 strncpy?

问题描述

我知道strncpy这里strcpy所说的更安全的版本。

但是,当我想从 to 复制src并且dst不是dst一个干净的缓冲区时,我会得到不需要的结果,可以通过以下方式避免strcpy

char *p = "123";
char a[10] = "aaaaaa";

strncpy(a,p,strlen(p));
printf("%s\n", a);   // 123aaa

strcpy(a,p);
printf("%s\n", a);   // 123 <- desired output, as the trailing a's are garbage

在我的实际情况下,我知道strlen(src) < sizeof(dst)(至少,如果不是这样,程序会更快崩溃),所以我可以安全地strcpy.

但是,如果strncpy是我应该使用的,那么我必须在之后添加dst[strlen(src)] = '\0'以避免垃圾(或者更好的是,事先初始化缓冲区?)?

标签: cstrcpystrncpy

解决方案


第三个参数strncpy表示目标缓冲区的大小。并且当它填满它时,它不会按设计添加空终止字符。

如果你有足够的空间给终结者并且你坚持strncpy,那就通过strlen(p) + 1,这样它就不会认为它耗尽了目标缓冲区。

就像现在已经注意到的许多人一样。这种使用strncpy违背了目的,实际上并不比简单地调用strcpy. , 的唯一实际用途strncpy是如果您想就地覆盖字符串的一部分(这是您偶然发现的用例)。虽然这也是有问题的用途......


推荐阅读