手动实现的C语言string.h 头文件的字符串函数

来源:互联网 发布:ubuntu php 安装路径 编辑:程序博客网 时间:2024/05/16 03:00
研究C语言,首先要明白其库函数…
001#include<stdio.h>
002char* strcpy(char* dest,const char* src);  //字符串拷贝
003char* strcat(char* dest,const char* src);  //字符串连接,返回dest字符串
004char* strncat(char* dest, const char* src, int size);//把src前n个字符串连接到dest,返回dest字符串
005int   strcmp(const char* src1,const char* src2);  //字符串比较  返回值: 1:> 0:= -1<
006int   strncmp(const char* src,const char* dst,int size);  //dst前n个字符和src比较返回值: 1:>  0:=  -1<
007int   strlen(const char* src);  //返回字符串长度
008char* strchr(const char* src, int ch); //字符ch在字符串第一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
009char* strrchr(const char* src, int ch); //字符ch在字符串最后一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
010char* strstr(const char* src, const char* sub); //字符串sub在字符串第一次出现的位置,返回出现字符串sub位置开始到字符串结束位置的指针
011//memery copy operate function==================//
012void* memcpy(void* dest,const void* src,unsigned int size); //把src的内容拷到dest内存里去,并返回dest指向的内存地址
013void* memset(void* dst, int ch, unsigned int size); //把dst内存中的size大小用使用ch来初始化,并返回dest指向的内存地址
014int   memcmp(const void* src1, const void* src2, unsigned int size); //比较内存中src1与src2中的前size 个字符是否相等,1:>  0:=  -1<  (see strncmp(const char*,const char*,unsigned int))
015void* memchr(const void* dst, int ch, unsigned int size); //在内存中的某一范围内,查找特定的字符ch,并返回指向ch的指针
016void* memmove(void* dst, const void* src, unsigned int size); //memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些.返回指向dest的指针
017//memery copy operate function==================//
018int main()
019{
020// printf("the string len=%d/n",strlen("helloWorld")); 
021// char dest[20];
022// printf("the string is=%s/n",strcpy(dest,"helloWorld"));
023// char dest[30]="hello--";
024// printf("after connect sub string is=%s/n",strcat(dest,"world"));
025// char dest[30]="hello--";
026// printf("after connect sub string is=%s/n",strncat(dest,"world_programe",4));
027// printf("the string compare result is=%d/n",strcmp("hello","aello"));
028// printf("the string compare result is=%d/n",strncmp("hello","hello_good",5));
029// printf("the char appear position is=%s/n",strchr("hello-r-es-d",'-'));
030// printf("the char appear position is=%s/n",strrchr("hel*lo-r*-e*s-d",'*'));
031// printf("the sub string is=%s/n",strstr("hello_world","lo"));
032char dest[20];
033// printf("the sub string is=%s/n",memcpy(dest,"hello..111",sizeof(dest)));
034printf("the sub string is=%s/n",memset(dest,'0',sizeof(dest)));
035return 0;
036}
037//=========================================================//
038int  strlen(const char* src)
039{
040const char* p=src;
041

while(*p!='/0')

{

  p++;

042return p-src;
043}
044//=========================================================//
045char* strcpy(char* dest,const char* src)
046{
047if(dest&&src)
048{
049int i=0;
050while((*(dest+i)=*(src+i))!='/0') i++;
051*(dest+i)='/0';
052// return dest;
053}
054return dest;
055}
//微软源码
char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;

        while( *cp++ = *src++ )
                ;               /* Copy src over dst */

        return( dst );
}
//
056//=========================================================//
057char* strcat(char* dest,const char* src)
058{
059if(dest&&src)
060{
061int len=strlen(dest);
062// printf("len=%d/n",len);
063int i=0;
064while((*(dest+len+i)=*(src+i))!='/0') i++;
065*(dest+len+i)='/0';
066}
067return dest;
068}
069//=========================================================//
070char* strncat(char* dest, const char* src, int size)
071{
072if(dest&&src)
073{
074int len=strlen(dest);
075int i=0;
076while((i<size)&&((*(dest+len+i)=*(src+i))!='/0')) i++;
077}
078return dest;
079}
080//=========================================================//
081int strcmp(const char* src1,const char* src2)
082{
083int equal;
084int i=0;
085while(!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
086i++;
087if(equal<0) return -1;
088else if(equal>0) return 1;
089else return 0;
090}
int strcmp(char *str1,str2)
{
char *p1,*p2;
p1=str1;
p2=str2;
while(*p2 && *p1)
if(*(p1++)- *(p2++) )return *(p1++)- *(p2++) ;
return 0;

}

091//=================比较两个字符串前size 个字符串是否相等==========================//
092int strncmp(const char* src1,const char* src2,int size)
093{
094int equal;
095int i=0;
096while((i<size)&&!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
097i++;
098if(equal<0) return -1;
099else if(equal>0) return 1;
100else return 0;
101}
102//=========================================================//
103char* strchr(const char* src, int ch)
104{
105int i=0;
106while(*(src+i)&&(*(src+i)!=ch)) i++;
107return (char*)(src+i);
108}
109//=========================================================//
110char* strrchr(const char* src, int ch)
111{
112int len=strlen(src);
113int i=0;
114while(i<len&&(*(src+len-i)!=ch)) i++;
115return (char*)(src+(len-i));
116}
117//=========================================================//
118char* strstr(const char* src, const char* sub)
119{
120if(src&&sub)
121{
122int subLen=strlen(sub);
123int srcLen=strlen(src);
124int nomatch=1;
125int fds=srcLen-subLen+1;
126int i=0;
127if(fds>0) //find counts in the string
128while((nomatch=strncmp(src+i,sub,subLen))&&fds--)//把当前src的指针往后推,直到找到与sub指针相同为止
129i++;
130if(nomatch)
131return 0;
132else
133return (char*)(src+i);
134}
135return 0;
136}
137//====================memory operate=====================================//
138//====================memory operate=====================================//
139void* memcpy(void* dest,const void* src,unsigned int size)
140{
141if(dest&&src&&size>0)
142{
143int i=0;
144unsigned char* p=(unsigned char*)dest;
145unsigned char* q=(unsigned char*)src;
146while((i<size)&&(*(p+i)=*(q+i)))
147i++;
148return dest;
149}
150return 0;
151}
152//=========================================================//
153void* memset(void* dst, int ch, unsigned int size)
154{
155int i=0;
156unsigned char* p=(unsigned char*)dst;
157while((i<size)&&(*(p+i)=ch))
158i++;
159return dst;
160}
161//=========================================================//
162int  memcmp(const void* src1, const void* src2, unsigned int size)
163{
164}
165//=========================================================//
166void* memchr(const void* dst, int ch, unsigned int size)
167{
168}
169void* memmove(void* dst, const void* src, unsigned int count)
170{
171void * ret = dst;
172if (dst <= src || (char *)dst >= ((char *)src + count))
173{
174while (count--)
175{
176*(char *)dst = *(char *)src;
177dst = (char *)dst + 1;
178src = (char *)src + 1;
179}
180}
181else
182{
183dst = (char *)dst + count - 1;
184src = (char *)src + count - 1;
185while (count--)
186{
187*(char *)dst = *(char *)src;
188dst = (char *)dst - 1;
189src = (char *)src - 1;
190}
191}
192return(ret);
193}
转自: http://www.yqshare.com/string-h-fuction.html
原创粉丝点击