当前位置:   article > 正文

关于memcpy(),memmove(),strcpy()的小结_memcpy时间复杂度

memcpy时间复杂度

memcpy()的实现:

// A C implementation of memcpy()
#include<stdio.h>
#include<string.h>
 
void myMemCpy(void *dest, void *src, size_t n)
{
//此处应加assert(dest != NULL && src != NULL);
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;
 
// Copy contents of src[] to dest[]
for (int i=0; i<n; i++)
    cdest[i] = csrc[i];
}
 
// Driver program
int main()
{
char csrc[] = "GeeksforGeeks";
char cdest[100];
myMemCpy(cdest, csrc, strlen(csrc)+1);
printf("Copied string is %s", cdest);
 
int isrc[] = {10, 20, 30, 40, 50};
int n = sizeof(isrc)/sizeof(isrc[0]);
int idest[n], i;
myMemCpy(idest, isrc, sizeof(isrc));
printf("\nCopied array is ");
for (i=0; i<n; i++)
    printf("%d ", idest[i]);
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

memcpy有个问题就是当src和dst有重叠时,在copy过程中就会覆盖以后要copy的内容。此时应该用memmove。
下面的代码来自
原文链接:https://blog.csdn.net/z702143700/article/details/47107701

void* memmove(void* dst,const void* src,size_t count)
{
    assert(NULL !=src && NULL !=dst);
    char* tmpdst = (char*)dst;
    char* tmpsrc = (char*)src;

    if (tmpdst <= tmpsrc || tmpdst >= tmpsrc + count)
    {
        while(count--)
        {
            *tmpdst++ = *tmpsrc++; 
        }
    }
    else
    {
        tmpdst = tmpdst + count - 1;
        tmpsrc = tmpsrc + count - 1;
        while(count--)
        {
            *tmpdst-- = *tmpsrc--;
        }
    }

    return dst; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

也可以先从src拷贝到一个临时数组tmp,再从tmp拷贝到dest。不过这个空间复杂度是O(n)。
下面的代码来自
https://www.geeksforgeeks.org/write-memcpy/


//C++ program to demonstrate implementation of memmove()
#include<stdio.h>
#include<string.h>
 
// A function to copy block of 'n' bytes from source
// address 'src' to destination address 'dest'.
void myMemMove(void *dest, void *src, size_t n)
{
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;
 
// Create a temporary array to hold data of src
char *temp = new char[n];
 
// Copy data from csrc[] to temp[]
for (int i=0; i<n; i++)
    temp[i] = csrc[i];
 
// Copy data from temp[] to cdest[]
for (int i=0; i<n; i++)
    cdest[i] = temp[i];
 
delete [] temp;
}
 
// Driver program
int main()
{
char csrc[100] = "Geeksfor";
myMemMove(csrc+5, csrc, strlen(csrc)+1);
printf("%s", csrc);
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

strcpy()只能拷贝字符串,当遇到字符串末尾的NULL(‘\0’)时,它会删除该字符,并结束拷贝。
memcpy()可以拷贝任意类型的字符,不会考虑NULL字符,只拷贝所指定要拷贝的字符数。

一个strcpy的代码例子如下:

void *strcpy(char *strDest, const char *strSrc) {
    assert(strDest != NULL & strSrc != NULL);
    char *addr = strDest;
    while ((*strDest++ = *strSrc++) != '\0');
    return addr;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/592459
推荐阅读
相关标签
  

闽ICP备14008679号