前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >串拷贝(strcpy)和内存拷贝(memcpy)

串拷贝(strcpy)和内存拷贝(memcpy)

作者头像
杨源鑫
发布2019-07-04 15:58:00
3K0
发布2019-07-04 15:58:00
举报
文章被收录于专栏:嵌入式开发圈
串拷贝strcpy()函数

strcpy()函数只能拷贝字符串。strcpy()函数将源字符串的每个字节拷贝到目录字符串中,当遇到字符串末尾的null 字符(\0)时,它会删去该字符,并结束拷贝。

strcat函数,在C库中原型如下:

char *strcpy(char* dest, const char *src);

使用时需要包含头文件:

#include <string.h>

功能:

把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。注意:必须保证目标地址dest有足够大的空间,要不然会出错。

strcpy使用案例一

代码语言:javascript
复制
 1#include <stdio.h>
 2#include <string.h>
 3int main(void)
 4{
 5    char *src = "hello world";
 6    char dest[20] ; 
 7    char *p = NULL;
 8    strcpy(dest , src);
 9    printf("src:%s \ndest:%s\n" , src , dest);
10    return 0 ; 
11}

运行结果:

strcpy使用案例二

如果dest数组没有这么大的空间,假设不是20,我们传个1试试吧。strcpy_test.c

代码语言:javascript
复制
 1#include <stdio.h>
 2#include <string.h>
 3int main(void)
 4{
 5    char *src = "hello world";
 6    char dest[1] ; 
 7    char *p = NULL;
 8    strcpy(dest , src);
 9    printf("src:%s \ndest:%s\n" , src , dest);
10    return 0 ; 
11}

运行结果:

mystrcpy简单实现-案例三

我们看到,当空间不能满足于存储的时候那么就出现段错误了。既然知道了实现原理,我们不妨来实现这个函数: mystrcpy.c

代码语言:javascript
复制
 1#include <stdio.h>
 2//strcpy拷的时候有带尾零
 3char *mystrcpy(char *dest , const char *src);
 4int main(void)
 5{
 6    char *src = "hello kitty";
 7    char dest[100];
 8    mystrcpy(dest , src);
 9    printf("dest:%s\n" , dest);
10    return 0 ; 
11}
12
13char *mystrcpy(char *dest , const char *src)
14{
15    char *tmp = dest; 
16    while(*tmp++=*src++) ; 
17    return dest ; 
18}

运行结果

同样的,我们只是实现了一个简单版本的strcpy函数,传参的时候应当注意什么呢?这类问题同样留给读者自行去尝试和优化,同时这也是笔试必考的题目,希望引起重视。

内存拷贝memcpy()函数

memcpy()函数可以拷贝任意类型的数据。因为并不是所有的数据都以null 字符结束,所以你要为memcpy()函数指定要拷贝的字节数。

memcpy函数,在C库中原型如下:

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

使用时需要包含头文件:

#include <string.h>

功能: 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

memcpy使用案例一

代码语言:javascript
复制
 1//memcpy.c
 2#include <stdio.h>
 3#include <string.h>
 4int main()
 5{
 6    char* s="GoldenGlobalView";
 7    char d[20];
 8    clrscr();
 9    memcpy(d,s,(strlen(s)+1));        //+1 是为了将字符串后面的'\0'字符结尾符放进来,去掉+1可能出现乱码
10    printf("%s",d);
11    getchar();
12    return 0;
13}

运行结果: Golden Global View

memcpy使用案例二

代码语言:javascript
复制
 1#include<string.h>
 2int main(
 3{
 4    char* s="GoldenGlobalView";
 5    char d[20];
 6    memcpy(d,s+12,4);//从第13个字符(V)开始复制,连续复制4个字符(View)
 7    d[4]='\0';//memcpy(d,s+12*sizeof(char),4*sizeof(char));也可
 8    printf("%s",d);
 9   getchar();
10   return 0;
11}

运行结果:View

memcpy使用案例三

代码语言:javascript
复制
 1#include<stdio.h>
 2#include<string.h>
 3int main(void)
 4{
 5    char src[]="******************************";
 6    char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
 7    printf("destination before memcpy:%s\n",dest);
 8    memcpy(dest,src,strlen(src));
 9    printf("destination after memcpy:%s\n",dest);
10    return 0;
11}

运行结果:

代码语言:javascript
复制
1destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
2destination after memcpy: ******************************as6

mymemcpy简单实现-案例四

代码语言:javascript
复制
 1void* mymemcpy(void*destaddr,voidconst*srcaddr,size_tlen)
 2{
 3    char* dest=destaddr;
 4    char const* src=srcaddr;
 5    while(len-->0)
 6    {
 7    *dest++ = *src++;
 8    }
 9    return destaddr;
10}

当然,和mystrcpy一样,memcpy也可以有很多实现版本,留给读者自己去实现,同时这也是笔试题面试题常考的。

总结

在拷贝字符串时,通常都使用strcpy()函数;在拷贝其它数据(例如结构)时,通常都使用memcpy()函数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式开发圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档