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}
运行结果:
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}
运行结果:
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}
运行结果
同样的,我们只是实现了一个简单版本的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()函数。