【问题标题】:What is the difference between memcpy() and strncpy() given the latter can easily be a substitute for the former?memcpy() 和 strncpy() 之间有什么区别,因为后者可以很容易地替代前者?
【发布时间】:2013-05-09 07:54:55
【问题描述】:

memcpy()strncpy() 之间的显着区别是什么?我问这个是因为我们可以轻松地更改strncpy() 来复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char* 参数转换为char* 并将第三个参数更改为该非字符类型的大小。在下面的程序中,我成功地用它来复制一个整数数组的一部分到另一个,它和memcpy()一样好。

 #include <stdio.h>
    #include <string.h>


    int main ()
    {
    int arr[2]={20,30},brr[2]={33,44};
    //memcpy(arr,brr,sizeof(int)*1);
    strncpy((char*)arr,(char*)brr,sizeof(int)*1);
    printf("%d,%d",arr[0],arr[1]);

    }

同样,我们可以使它适用于float 或其他数据类型。那么和memcpy()有什么显着区别呢?

PS:另外,我想知道为什么memcpy()string.h 头文件中,因为几乎所有的库函数都与字符串相关,而memcpy() 在自然。有什么原因吗?

【问题讨论】:

  • 我用谷歌搜索了它,但唯一类似的问题是 stackoverflow.com/questions/4593907/… ,但它没有回答我打算在这里问的问题。
  • memcopy 无条件复制,直到完成所需的字节数。 strncpy 将复制直到它到达一个空值(字符串终止符),或复制n 个字节。因此,您不能在任意二进制数据上使用 strncpy,因为这些数据中自然可以包含空值。
  • 很高兴这次我得到了很好的答案,而不是像我之前的问题那样一连串的反对票!!

标签: c memcpy strncpy string.h


【解决方案1】:

简单的区别是memcpy() 可以复制带有嵌入空字符的数据(也就是 C 风格字符串中的字符串终止符),而strncpy() 只会将字符串复制到给定字符数或第一个空字符的位置(并用 0 填充其余字符串)。

换句话说,它们确实有两个截然不同的用例。

【讨论】:

  • 用 0 或 '0' 填充?我的意思是 NULL 或字符 '0'?
  • 根据这个链接 (cplusplus.com/reference/cstring/strncpy),它是零。
  • 字符 0(如 0x0,而不是 '0')是空字符。 strncpy() 填充字符 0(即空字符)。
  • @nebain 你只对第二部分是正确的。字符 0 不是空字符,数字零是。
【解决方案2】:

以数组中的这些数字为例:

 brr[2]={512,44};

第一个数字brr[0] 的最低有效字节是05120x200)这将导致1)strncpy 停止复制。 strncpy 不会复制 null 后面的字符 字符。

1)要学究气(见 cmets),只要实现有 sizeof (int) &gt; 1 就成立。

【讨论】:

  • 如果int 是 16 位长并以大端顺序存储怎么办?
  • 相同。空字符(尽管位于不同的位置)将停止 strncpy 复制。
  • @ouah:是的,但不是两个字节!
  • @Thokchom:一个字节有CHAR_BIT位。
  • @Thokchom:抱歉,我并没有真正打算参与这个问题。我只是觉得这个答案有点不确定。 (无论如何都不要贬低 ouah 通常的出色贡献!)
【解决方案3】:

当需要复制内存块时,memcpy 很有用,并且字符串 strncpy 的 for 中的数据是有意义的,因为 '\0' 终止字符串的自然优势。否则在执行后都执行相同的复制模式。

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2014-10-24
    • 2011-06-12
    • 2015-02-24
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多