为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要使用strncpy而不是strcpy?

为什么要使用strncpy而不是strcpy?

C
慕沐林林 2019-07-01 09:40:15
为什么要使用strncpy而不是strcpy?我偶然发现这个例子:char source[MAX] = "123456789";char source1[MAX] = "123456789";char destination[MAX] = "abcdefg";char destination1[MAX] = "abcdefg";char *return_string;int index = 5;/* This is how strcpy works */printf("destination is originally = '%s'\n", destination);return_string = strcpy(destination, source);printf("after strcpy, dest becomes '%s'\n\n", destination);/* This is how strncpy works */printf( "destination1 is originally = '%s'\n", destination1 );return_string = strncpy( destination1, source1, index );printf( "After strncpy, destination1 becomes '%s'\n", destination1 );产生了这一产出:destination is originally = 'abcdefg' After strcpy, destination becomes '123456789' destination1 is originally = 'abcdefg' After strncpy, destination1 becomes '12345fg'这让我想知道为什么会有人想要这种效果。看起来会很混乱。这个程序让我觉得你基本上可以复制某人的名字。与汤姆·布罗科(Tom Brokaw)在一起。使用 strncpy() 过关 strcpy()?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

strncpy通过要求您在缓冲区溢出中添加一个长度来防止缓冲区溢出。strcpy取决于尾随\0,这可能并不总是发生。

其次,为什么您选择只复制7个字符串上的5个字符,这是我无法理解的,但它正在产生预期的行为。它只是在复制第一个n人物,在哪里n是第三个论点。

这个n所有函数都用作防范缓冲区溢出的代码。请使用它们来代替旧的函数,例如strcpy.


查看完整回答
反对 回复 2019-07-01
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

这个strncpy()函数的设计考虑了一个非常特殊的问题:操作以原始UNIX目录条目的方式存储的字符串。它们使用一个固定大小的数组,只有在文件名比数组短的情况下才使用NUL-结束符。

这就是两个奇怪的原因strncpy():

  • 如果目标完全被填充,它不会在目的地放置一个NUL-Enminator;并且
  • 它总是完全填充目的地,必要时使用null。

为了“更安全”strcpy()“,你最好用strncat()就像这样:

if (dest_size > 0){
    dest[0] = '\0';
    strncat(dest, source, dest_size - 1);}

这将永远是零终止的结果,并不会复制超过必要。


查看完整回答
反对 回复 2019-07-01
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

虽然我知道背后的意图strncpy它并不是一个很好的功能。避免两者兼而有之。陈雷蒙德解释.

就我个人而言,我的结论只是为了避免strncpy如果你在处理以空结尾的字符串的话,它的所有朋友。尽管名称中有“str”,但这些函数不会产生以空结尾的字符串。它们将以空结尾的字符串转换为原始字符缓冲区。如果将以空结尾的字符串作为第二个缓冲区使用,则使用它们是完全错误的。如果源太长,不仅不能得到正确的空终止,而且如果源短,则会得到不必要的空填充。

另见为什么strncpy不安全?


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 737 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信