编辑:我已经添加了示例的来源。
我发现了这个示例:
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 );
这段代码产生了以下输出:
目标初始值=`abcdefg` 执行strcpy后,目标变为`123456789`
目标1初始值=`abcdefg` 执行strncpy后,目标1变为`12345fg`
这让我想知道为什么会有人想要这种效果。看起来会很混乱。这个程序让我觉得你基本上可以用Tom Bro763覆盖某人的姓名(例如Tom Brokaw)。
使用strncpy()
相比于使用strcpy()
有哪些优势?
strcpy
而不是strncpy
?” - Sam Harwellstrncat
比strncpy
更愚蠢;我们多少次会知道一个未知长度字符串后面的缓冲区还剩多少空间?如果目标字符串的长度是已知的,应该找到源字符串的长度(如果未知),将该值夹在可用的缓冲区空间内,然后使用memcpy
复制适合的部分,并手动存储零。如果目标字符串的长度未知,则通常需要找到其长度以了解超出多少空间可用,在这种情况下仍适用上述方法。 - supercatstrncpy
具有超出您所期望的奇怪行为,这是“更安全的strcpy
版本”。 - xdavidliu