C strcpy和strcat
strcpy的所谓正确写法:
char *strcpy(char *strDestination, const char *strSource) { assert(strDestination!=NULL && strSource!=NULL); char *strD=strDestination; while ((*strDestination++=*strSource++)!='\0') return strD; }
char *strcat(char *strDest, const char *strSrc) { char *address = strDest; assert((strDest != NULL) && (strSrc != NULL)); while(*strDest) { strDest++; } while(*strDest++ = *strSrc++){} return address; }
这就是所谓的面试笔试最常见最常见的,而且经常被鄙视的strcpy
头文件:string.h
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
好了,不说这四行代码到底为什么这么写,内事不决问百度去。
单说函数本身,传入的是两个指针,第二个是常指针,但是一个必须满足的条件是第一个参数必须传入一个char[]数组,而不可能是一个
char *a="fewfa";
这样的一个指针,或者更sb的是一个空指针
char *a;
字符数组初始化的时候要分配长度,不分配会默认,C#还是可以再次分配,不说这个,我的意思是说,我既然要拷贝一个字符串,那我怎么知道字符串多长!10w,百千,还是更多,那这个方法是不是在某些场合不适应,还有strcat,同样的问题,参数必须是一个足够大已经分配过内存的指针,如果没有分配足够内存,会出错。
荡漾了,写一个strcat(仅个人意见)
#include<stdio.h> #include <stdlib.h> #include <assert.h> char* strcat(char * strDest,const char * strSrc) { char *from=strDest; const char *source=strSrc; assert((strDest!=NULL) && (strSrc !=NULL)); int length=0; while(*strDest!='\0') { strDest++; length++; } char * ret=(char *)malloc(length); char *back=ret; while(*(from)!='\0'&&(*ret++ = *from++)) {} while((*ret++ = *source++)!='\0') {} return back; } void main() { char *a="fherweufashjewadfa"; char *b="uiorewgfagipobagbi"; char *c=strcat(a,b);int d=0; printf("%s\n",c); scanf("%d",d); }