1. memcpy 函数

原型:void *memcpy(void *dest, const void *src, size_t n) 

作用:把指针src指向的内存内容的前n个字节拷贝到指针dest指向的内存中

(1)拷贝字符串数据至栈区字符数组堆区指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main ()
{
    char srcName[]="Cristiano Ronaldo";
    char destName1[100]; // 栈区字符数组,100字节
    char *destName2 = (char *)malloc(strlen(srcName)+1); //堆区空间 strlen(srcName)+1
 
    memcpy(destName1, srcName, strlen(srcName)+1);
    memcpy(destName2, srcName, strlen(srcName)+1);
 
    printf("srcName   is %s\n", srcName);
    printf("destName1 is %s\n", destName1);
    printf("destName2 is %s\n", destName2);
 
    free(destName2);
    return 0;
}

测试结果:

PS D:\Code\Data Structure> .\test.exe
srcName   is Cristiano Ronaldo
destName1 is Cristiano Ronaldo
destName2 is Cristiano Ronaldo

 

(2)拷贝结构体至堆区内存

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

typedef struct student_info_s
{
    int stuID;
    char *name;
    int math;
}STUDENT_INFO_S;

int main()
{
    STUDENT_INFO_S studentA;
    studentA.stuID = 100;
    studentA.name = (char *)(void*) "Cristiano Ronaldo";
    studentA.math = 98;

    STUDENT_INFO_S* pstudentB = (STUDENT_INFO_S*)malloc(sizeof(STUDENT_INFO_S));
    if (NULL != pstudentB)
    {
        memcpy(pstudentB, &studentA, sizeof(studentA));  
        printf("After copy: B.studentID = %d, B.name = %s, B.mathscore = %d\n",
                pstudentB->stuID, pstudentB->name, pstudentB->math);
    }

    free(pstudentB);
    return 0;
}

 测试结果:

PS D:\Code\Data Structure> .\test.exe
After copy: B.studentID = 100, B.name = Cristiano Ronaldo, B.mathscore = 98

 

2. strlcpy 函数

原型:size_t strlcpy (char *dest,  const char *src,  size_t size)

返回值:返回值是源字符串 src 的长度(不包括末尾的 \0

作用: strlcpy会将源字符串src的内容复制到目标缓冲区dest中,最多复制size - 1个字符,并在目标缓冲区的末尾添加空字符\0  ,以确保结果是一个有效的 C 字符串。

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

/* 本地实现strlcpy函数 */
size_t strlcpy(char *dest, const char *src, size_t size) 
{
    size_t len = strlen(src);
    if (size == 0) 
    {
        return 0;
    }
	
    if (len >= size) 
    {
        memcpy(dest, src, size - 1);
        dest[size - 1] = '\0';
    } 
    else 
    {
        memcpy(dest, src, len + 1);
    }
    return len;
}

int main ()
{
    const char srcName[]="Cristiano Ronaldo"; // 17个字母
    char destName[18];

    strlcpy(destName, srcName, sizeof(destName)); //拷贝18-1=17个字母,并在结尾加 '\0'
	
    printf("srcName is %s\n",srcName);
    printf("destName is %s\n",destName);
    
    return 0;
}

 测试结果:

PS D:\Code\Data Structure> .\test.exe
srcName is Cristiano Ronaldo
destName is Cristiano Ronaldo

 

posted on 2022-10-12 10:21  轩~邈  阅读(117)  评论(0)    收藏  举报