代码之家  ›  专栏  ›  技术社区  ›  Barry

strncpy和snprintf之间的区别?

c
  •  1
  • Barry  · 技术社区  · 7 年前

    两者的区别是什么

    strncpy(dst, src, n)
    

    snprintf(dst, n, "%s", src)
    

    在尝试进行有界字符串复制时,我应该选择其中一个还是另一个?如果是,为什么?

    1 回复  |  直到 6 年前
        1
  •  13
  •   M.M    6 年前

    strncpy 不是有界的 strcpy .这是一个固定长度(非有界、固定长度)的操作,目标不是C字符串(以null结尾),而是一个 空填充 字段,比如70年代和80年代早期某些类型的数据记录表中使用的内容。基本上 没有现代意义 除非你真的想要这种行为,否则不应该使用。

    snprintf 是“有界”的正则C函数吗 拷贝字符串 “.在POSIX系统上, strnlen + memcpy 这是另一个很好的选择,如果需要支持长度超过 INT_MAX .如果你没有 斯特伦 ,你可以很容易地用 memchr 也要这样做。

    请注意 snprintf 不是“有界”的意思,即对从源代码中读取的内容有界;它必须读取整个源字符串以确定返回值,返回值可能会产生时间开销,并且取决于源是否是有效(终止)字符串。如果您希望在源和目标的意义上对其进行限定,可以执行以下操作:

    snprintf(dest, n, "%.*s", (int)n-1, src);
    

    然而,这是非常非惯用且容易出错的,我只会使用它 斯特伦 memcpy 相反

        2
  •  5
  •   chux    6 年前

    使用 snprintf(dst, n, "%s", src) .

    snprintf(dst,n,“%s”,src) 确保 dst 空字符 结束。 strncpy(dst, src, n) 不会那样做。

    strncpy(dst、src、n) 总是这样 n 抄袭鉴于 snprintf(dst, n "%s", src) min(strlen(src),n) 副本