串拷贝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}
运行结果:
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()函数。