strcpy():strcpy(dest,src); strcpy把src所指向以'\0'结尾的字符串复制到dest所指的数组中,返回指向dest的指针。
当sizeof(dest)>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
当sizeof(dest)<sizeof(src)时,拷贝出错。这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。
strncpy():strncpy(dest,src,n); strncpy把src所指向以'\0'结尾的字符串的前n个字符复制到dest所指的数组中,返回指向dest的指针。
当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
当n<sizeof(src)时,只拷贝src前n-1个字符串到dest,不会为dest字符串后面加入'\0';所以是不安全的,复制完后需要手动添加字符串的结束符才行。
strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下:
· 函数声明以及实现代码 char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL)) return NULL; char *ret = dst; //[1] while ((*dst++=*src++)!='\0'); //[2] return ret;//[3] } (1)const 修饰:源字符串参数用const修饰,防止修改源字符串;
(2)空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查;
(3)为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;
(4)以上所示[2]处,为简单的字符串的复制过程,正好表明strcpy函数遇到'\0'将会停止;另外while ((*dst++=*src++)!='\0');可写为:
while ((*dst=*src)!='\0'){ //该判断决定复制的字符串结尾为"\0"
dst++;
src++;} 所以,dst指针已经移动,使用ret进行返回。
char* strncpy(char* dest, const char* source, size_t count) { char* start=dest; while (count && (*dest++=*source++)) count--; if(count) //当sizeof(source)> count,count=0;当sizeof(source)< count,后加'\n' while (--count) *dest++='\0'; return(start); }
memset主要用于为新申请的内存进行初始化,它是对较大的结构体和数组进行清零操作的一种最快方法。 函数原型:void *memset(void *s, int ch, size_t n); 函数解释:将s中前n个字节用ch填充,并返回s。 对于这些最基本的函数,总有一种冲动想知道其是怎么实现的。 下面就是根据源码而来的memset实现:
void* memset(void* dst,int val, size_t count) { void* ret = dst; while(count--) { *(char*)dst = (char)val; dst = (char*)dst + 1; //移动一个字节 } return ret; }