猿问

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

为什么要使用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()?


慕沐林林
浏览 738回答 3
3回答

catspeake

strncpy通过要求您在缓冲区溢出中添加一个长度来防止缓冲区溢出。strcpy取决于尾随\0,这可能并不总是发生。其次,为什么您选择只复制7个字符串上的5个字符,这是我无法理解的,但它正在产生预期的行为。它只是在复制第一个n人物,在哪里n是第三个论点。这个n所有函数都用作防范缓冲区溢出的代码。请使用它们来代替旧的函数,例如strcpy.

幕布斯7119047

这个strncpy()函数的设计考虑了一个非常特殊的问题:操作以原始UNIX目录条目的方式存储的字符串。它们使用一个固定大小的数组,只有在文件名比数组短的情况下才使用NUL-结束符。这就是两个奇怪的原因strncpy():如果目标完全被填充,它不会在目的地放置一个NUL-Enminator;并且它总是完全填充目的地,必要时使用null。为了“更安全”strcpy()“,你最好用strncat()就像这样:if (dest_size > 0){     dest[0] = '\0';     strncat(dest, source, dest_size - 1);}这将永远是零终止的结果,并不会复制超过必要。

慕妹3146593

虽然我知道背后的意图strncpy它并不是一个很好的功能。避免两者兼而有之。陈雷蒙德解释.就我个人而言,我的结论只是为了避免strncpy如果你在处理以空结尾的字符串的话,它的所有朋友。尽管名称中有“str”,但这些函数不会产生以空结尾的字符串。它们将以空结尾的字符串转换为原始字符缓冲区。如果将以空结尾的字符串作为第二个缓冲区使用,则使用它们是完全错误的。如果源太长,不仅不能得到正确的空终止,而且如果源短,则会得到不必要的空填充。另见为什么strncpy不安全?
随时随地看视频慕课网APP
我要回答