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

简介: 串拷贝(strcpy)和内存拷贝(memcpy)

串拷贝strcpy()函数


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


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

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

使用时需要包含头文件:

#include <string.h>

功能:

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


strcpy使用案例一

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}

运行结果:

640.png

strcpy使用案例二

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

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}

运行结果:

640.jpg

mystrcpy简单实现-案例三

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

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}

运行结果

640.jpg

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


内存拷贝memcpy()函数


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


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

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

使用时需要包含头文件:

#include <string.h>

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


memcpy使用案例一

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使用案例二

 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使用案例三

 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}

运行结果:

1destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
2destination after memcpy: ******************************as6


mymemcpy简单实现-案例四

 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()函数。

目录
相关文章
|
6月前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
188 0
|
6月前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
5月前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
75 2
|
6月前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
223 6
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
64 0
|
3月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
5月前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
65 3
|
6月前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
85 4
|
6月前
|
Java 编译器 C语言
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
45 0
|
6月前
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)