记下这个知识点主要是为了预防在使用这些复制函数时因为复制后的字符串末尾不带’\0’在使用时形成bug触发代码功能异常的问题。

几个函数的对比表格

注意:在使用以下函数时要确保dest的大小 > 复制的字符串长度。(=都不行,所以为什么我们在定义数组时长度总是要+1)

原型 功能 返回值 区别 注意用法
char *strcpy(char * dest, const char * src) 复制字符串,将 src 所指向的字符串复制到 dest。 返回一个指向目标字符串dest的指针 会拷贝字符串结尾符’\0’ 要确保dest的大小 > 复制的字符串长度
char *strncpy(char * dest, const char * src, size_t n) 复制n个字符 同上 如果src_len >= n ,strncpy不会自动在末尾添加结束符’\0’;当src_len < n 时,dest 的剩余部分将用空字节填充 strncpy 的标准用法为:strncpy(path, src, sizeof(path)); 或(手动写上 \0) strncpy(path, src, strlen(path)); path[strlen(path)] = ‘\0’;。
void *memcpy(void * dest, const void * src, size_t n) 同上 同上 同上 除了复制字符串还可以复制其他类型数据,如数组、整型、结构体、类等。在数据中包含’\0’等特殊数据只能用memcpy。
int snprintf(char * dest, size_t n, const char *format, …) 拷贝n-1个字符到字符串dest。第n个字符自动加’\0’ 为src的长度,不是n。 字符串末尾必有’\0’ 注意:遇到特殊字符比如 %d 会转义

扩展知识:strlen()获取字符串的长度不含’\0’ ; sizeof()获取数组的长度包含’\0’ 。

memcpy和strcpy举例:

char aa[10]={0};
memcpy(aa,"aassk",5) ;
printf("aa=%s,len=%d\n",aa, strlen(aa));//aa=aassk  ,len=5
memcpy(aa,"111",3);
printf("aa=%s,len=%d\n",aa,strlen(aa));//aa=111sk  ,len=5
strcpy(aa,"22");
printf("aa=%s, len=%d\n",aa,strlen(aa));//aa=22  ,len=2

strncpy举例:

    char ss[20]={"oooooooooo"};

    char ab[]={"kkkkkk"};
    strncpy(ss,ab,sizeof(ab));//sizeof()获取数组的长度包含'\0' 
    printf(" size=%d, strlen=%d ss=%s\n\n",sizeof(ss),strlen(ss),ss);
    //       size=20, strlen=6  ss=kkkkkk

    char cc[]={"nnn"};
    strncpy(ss,cc,strlen(cc));//strlen()获取字符串的长度不含'\0' 
    printf(" size=%d, strlen=%d ss=%s\n\n",sizeof(ss),strlen(ss),ss);
    //       size=20, strlen=6  ss=nnnkkk
char ab[6]={"kkkkkk"};
    strncpy(ab,"pppppp",6);
    printf(" size=%d, strlen=%d  ab=%s\n\n",sizeof(ab),strlen(ab),ab);
    //       size=6,  strlen=16  ab=ppppppoooooooooo(有垃圾值,因为复制时没有复制到)'\0' 

snprintf举例:

char ab[8]={0};
int w=0;
w=snprintf(ab, 5, "abcdefghi") ;
printf("w=%d ab=%s",w,ab) ;//w=9, ab=abcd
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐