编辑:我已经添加了示例的源代码。
我碰到这个例子:
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 Bro763 复制某人的名字(例如 Tom Brokaw)。
使用有什么好处 strncpy()
over strcpy()
?
The strncpy()
函数的设计考虑到了一个非常特殊的问题:操作以原始 UNIX 目录条目的方式存储的字符串。它们使用一个短的固定大小的数组(14 字节),并且仅当文件名比数组短时才使用 null 终止符。
这就是这两个奇怪现象背后的原因strncpy()
:
- 如果目的地已完全填满,它不会在目的地上放置一个零终止符;和
- 它总是完全填充目的地,如果需要的话用 null 填充。
为了“更安全strcpy()
“,你最好使用strncat()
像这样:
if (dest_size > 0)
{
dest[0] = '\0';
strncat(dest, source, dest_size - 1);
}
这总是会导致结果无效,并且不会复制超出必要的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)