【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())

您所在的位置:网站首页 对字符串进行比较 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())

【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())

2024-07-12 03:29| 来源: 网络整理| 查看: 265

目录: strcpy()举例: memcpy()举例: strncpy()举例: memmove()举例:

我们首先来考虑一个简单的问题,我们定义了一个字符串,然后想要复制这个字符串,在C语言中,我们可以用for循环和指针来实现,假如我们用指针来操作

#include char str1[20]= "Zxiaoxuan"; char str2[20]; char * pts1 = str1 ; char * pts2 = str2; int main () { pts2=pts1; return 0; }

这样pts2只是复制字符串str1的地址,而不是复制整个字符串。

 

那么如何进行整个字符串的复制呢

我们可以采用数组的方式来进行 #include void copy_string(char str1[],char str2[]) { int i = 0; while(str2[i] != '\0') { str1[i] = str2[i]; i++; } str1[i] = '\0'; } int main() { char a[100]="zxiaoxuan"; char b[100]=" "; copy_string(b,a); printf("%s\n",b); return 0; }

输出: 在这里插入图片描述 2. 可以采用指针的方式来进行

#include void copy_string(char *p1,char *p2) { while(*p2 != '\0') { *p1 = *p2; *p1++; *p2++; } *p1 = '\0'; } int main() { char a[100]="zxiaoxuan"; char b[100]=" "; copy_string(b,a); printf("%s\n",b); return 0; }

输出: 在这里插入图片描述

除了上面两种,C语言有没有内置的函数来进行拷贝复制呢,当然是有的,下面我们来逐一介绍。

strcpy()

使用头文件:#include

定义:char *strcpy(char *dest, const char *src);

参数:

destinin:目标字符数组; source:源字符数组;

函数说明:strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。 用于对字符串进行复制,识别到字符串的结束符号‘\0’自动停止

返回值:返回参数dest 的字符串起始地址。

注意:

参数 dest 的内存空间要足够大,否则拷贝可能会造成缓冲溢出。strcpy() 在复制结束后会添加结束符\0,这点和strncpy()不同

strcpy()的参数是两个字符串指针,其中 *src源字符串可以是指针,数组名,或者字符串常量,但是*dest目标字符串必须位一个确定的数据对象(字符数组),而且应该已经开辟好了存储空间(已经做好初始化)

举例: #include #include int main () { char str1[]= "Zxiaoxuan"; char str2[20]; char str3[20]; strcpy (str2,str1); strcpy (str3, "copy successful"); printf ( "str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; }

输出:

在这里插入图片描述

memcpy()

使用头文件:C语言:#include C++:#include

定义:void memcpy(void *dest, const void *src, size_t n);

参数:

destinin:目标地址; source:源地址; n:复制的字节长度。

函数说明:memcpy()复制 src 所指的内存数据的 n 个字节到 dest所指的内存地址上。也就是从源地址复制n 个字节到目标地址

第一个和第二个指针都是void型且第二个指针不能被修改,第三个参数是需要拷贝的内存长度按字节记。

返回值:返回指向 dest 的指针。返回的指针类型是void。

注意:

memcpy()并不限制被复制的数据类型,只是逐字节地进行复制,任何数据类型都可以进行复制,例如字符数组、整型、结构体、类等

memcpy() 会完整的复制 num个字节,不会遇到‘\0’而结束,这点与 strcpy() 不同

dest 和 src所指的内存空间地址不能重叠

参数 dest 的内存空间要足够大,起码要大于等于 num个字节

通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

举例: #include #include #include #define N (20) int main() { char *p1 = "zxiaoxuan"; char *p2 = (char *)malloc(sizeof(char) * N); memcpy(p2, p1, N); printf("p2 = %s\n", p2); system("pause"); return 0; }

在这里插入图片描述

strncpy()

使用头文件:#include

定义:char *strncpy(char *dest, const char *src, size_t len);

参数:

destinin:目标字符数组; source:源字符数组; len:复制的字符串长度。

函数说明:strncpy()复制字符串 src 的前 len 个字节到 dest所指的内存地址上。

返回值:返回字符串dest

注意:

strncpy()在复制结束后不会向dest结尾添加’\0’结束符 这个是很重要的一个点,要记住如果source(源字符数组)的长度>复制的字符串数len,则只复制source(源字符数组)的前len个字符,不会自动添加结束符\0如果source(源字符数组)的长度


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3