gpt4 book ai didi

c - 为什么应该使用 strncpy 而不是 strcpy?

转载 作者:太空狗 更新时间:2023-10-29 16:15:45 27 4
gpt4 key购买 nike

编辑:我已经添加了示例的源代码。

我遇到了 this example :

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()有什么好处?

最佳答案

strncpy() 函数的设计考虑了一个非常特殊的问题:操作以原始 UNIX 目录条目的方式存储的字符串。它们使用了一个固定大小的短数组(14 字节),并且仅当文件名短于数组时才使用空终止符。

这就是 strncpy() 的两个奇怪之处背后的原因:

  • 如果目标已完全填满,它不会在目标上放置空终止符;和
  • 它总是完全填满目的地,必要时用空值填满。

为了“更安全的 strcpy()”,您最好像这样使用 strncat():

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

这将始终以 nul 终止结果,并且不会复制不必要的内容。

关于c - 为什么应该使用 strncpy 而不是 strcpy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258550/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com