在我的情况下strncpy或strlcpy

har*_*ari 17 c copy c-strings strncpy

我应该怎么用,当我要复制src_strdst_arr,为什么?

char dst_arr[10];
char *src_str = "hello";
Run Code Online (Sandbox Code Playgroud)

PS:我的头正在读的东西很多关于如何纺纱后比我的电脑硬盘快strncpystrlcpy.

注意:我知道strlcpy无处不在.这不是问题所在.

AnT*_*AnT 31

strncpy当您的目标字符串为零终止时,它永远不是正确的答案.strncpy是一个旨在与非终止固定宽度字符串一起使用的函数.更准确地说,其目的是将以零结尾的字符串转换为非终止的固定宽度字符串(通过复制).换句话说,strncpy这里没有意义.

你这里有真正的选择是间strlcpy朴素strcpy.

当您想要执行"安全"(即可能被截断)复制时dst_arr,使用的正确功能是strlcpy.

至于dst_ptr......没有"复制到dst_ptr" 这样的东西.您可以复制到指向的内存dst_ptr,但首先必须确保它指向某处并分配该内存.有很多不同的方法可以做到这一点.

例如,您可以dst_ptr指向dst_arr,在这种情况下答案与前一种情况相同 - strlcpy.

或者您可以使用分配内存malloc.如果您为字符串保证分配的内存量足够(即至少strlen(src_str) + 1分配了字节数),那么您可以使用plain strcpy或even memcpy来复制字符串.strlcpy在这种情况下没有必要也没有理由使用,虽然有些人可能更喜欢使用它,因为它以某种方式给他们带来额外安全感.

如果你故意分配更少的内存(即你希望你的字符串被截断),那么strlcpy就成为正确使用的函数.

  • @hari:目标字符串.`strncpy`是一个*conversion*函数,它将零终止的源字符串转换为非终止的固定宽度目标字符串. (2认同)
  • @hari:呃......我不明白这个问题.你的`dst_arr`最初是什么并不重要.最初它只是一块未初始化的未初始化内存.问题是你想要在'dst_arr`中创建什么.我假设你想在`dst_arr`中创建一个标准的普通零终止字符串(因为你说你要*复制*一个普通的以零结尾的字符串).如果是这样,请使用`strlcpy`.如果你想在`dst_arr`中创建一个"固定宽度的字符串"(这很不寻常,因为这些天大多数时候没有人使用过固定宽度的字符串),请使用`strncpy`. (2认同)

Mar*_*ett 5

strlcpy()strncpy()你更安全,你也可以使用它.
没有它的系统通常会有s_strncpy()相同的功能.

注意:在dst_ptr指向某些内容之前,您无法复制任何内容

  • 它有点安全,但也不安全.例如,strlcpy截断源字符串以适应目标,这是一个安全风险. (2认同)