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

研究C语言,首先要明白其库函数…
001 #include<stdio.h>
002 char* strcpy(char* dest,const char* src);  //字符串拷贝
003 char* strcat(char* dest,const char* src);  //字符串连接,返回dest字符串
004 char* strncat(char* dest, const char* src, int size);//把src前n个字符串连接到dest,返回dest字符串
005 int   strcmp(const char* src1,const char* src2);  //字符串比较  返回值: 1:> 0:= -1<
006 int   strncmp(const char* src,const char* dst,int size);  //dst前n个字符和src比较返回值: 1:>  0:=  -1<
007 int   strlen(const char* src);  //返回字符串长度
008 char* strchr(const char* src, int ch); //字符ch在字符串第一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
009 char* strrchr(const char* src, int ch); //字符ch在字符串最后一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
010 char* strstr(const char* src, const char* sub); //字符串sub在字符串第一次出现的位置,返回出现字符串sub位置开始到字符串结束位置的指针
011 //memery copy operate function==================//
012 void* memcpy(void* dest,const void* src,unsigned int size); //把src的内容拷到dest内存里去,并返回dest指向的内存地址
013 void* memset(void* dst, int ch, unsigned int size); //把dst内存中的size大小用使用ch来初始化,并返回dest指向的内存地址
014 int   memcmp(const void* src1, const void* src2, unsigned int size); //比较内存中src1与src2中的前size 个字符是否相等,1:>  0:=  -1<  (see strncmp(const char*,const char*,unsigned int))
015 void* memchr(const void* dst, int ch, unsigned int size); //在内存中的某一范围内,查找特定的字符ch,并返回指向ch的指针
016 void* memmove(void* dst, const void* src, unsigned int size); //memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些.返回指向dest的指针
017 //memery copy operate function==================//
018 int 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"));
032 char dest[20];
033 // printf("the sub string is=%s/n",memcpy(dest,"hello..111",sizeof(dest)));
034 printf("the sub string is=%s/n",memset(dest,'0',sizeof(dest)));
035 return 0;
036 }
037 //=========================================================//
038 int  strlen(const char* src)
039 {
040 const char* p=src;
041

while(*p!='/0')

{

  p++;

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

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

        return( dst );
}
//
056 //=========================================================//
057 char* strcat(char* dest,const char* src)
058 {
059 if(dest&&src)
060 {
061 int len=strlen(dest);
062 // printf("len=%d/n",len);
063 int i=0;
064 while((*(dest+len+i)=*(src+i))!='/0') i++;
065 *(dest+len+i)='/0';
066 }
067 return dest;
068 }
069 //=========================================================//
070 char* strncat(char* dest, const char* src, int size)
071 {
072 if(dest&&src)
073 {
074 int len=strlen(dest);
075 int i=0;
076 while((i<size)&&((*(dest+len+i)=*(src+i))!='/0')) i++;
077 }
078 return dest;
079 }
080 //=========================================================//
081 int strcmp(const char* src1,const char* src2)
082 {
083 int equal;
084 int i=0;
085 while(!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
086 i++;
087 if(equal<0) return -1;
088 else if(equal>0) return 1;
089 else 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 个字符串是否相等==========================//
092 int strncmp(const char* src1,const char* src2,int size)
093 {
094 int equal;
095 int i=0;
096 while((i<size)&&!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
097 i++;
098 if(equal<0) return -1;
099 else if(equal>0) return 1;
100 else return 0;
101 }
102 //=========================================================//
103 char* strchr(const char* src, int ch)
104 {
105 int i=0;
106 while(*(src+i)&&(*(src+i)!=ch)) i++;
107 return (char*)(src+i);
108 }
109 //=========================================================//
110 char* strrchr(const char* src, int ch)
111 {
112 int len=strlen(src);
113 int i=0;
114 while(i<len&&(*(src+len-i)!=ch)) i++;
115 return (char*)(src+(len-i));
116 }
117 //=========================================================//
118 char* strstr(const char* src, const char* sub)
119 {
120 if(src&&sub)
121 {
122 int subLen=strlen(sub);
123 int srcLen=strlen(src);
124 int nomatch=1;
125 int fds=srcLen-subLen+1;
126 int i=0;
127 if(fds>0) //find counts in the string
128 while((nomatch=strncmp(src+i,sub,subLen))&&fds--)//把当前src的指针往后推,直到找到与sub指针相同为止
129 i++;
130 if(nomatch)
131 return 0;
132 else
133 return (char*)(src+i);
134 }
135 return 0;
136 }
137 //====================memory operate=====================================//
138 //====================memory operate=====================================//
139 void* memcpy(void* dest,const void* src,unsigned int size)
140 {
141 if(dest&&src&&size>0)
142 {
143 int i=0;
144 unsigned char* p=(unsigned char*)dest;
145 unsigned char* q=(unsigned char*)src;
146 while((i<size)&&(*(p+i)=*(q+i)))
147 i++;
148 return dest;
149 }
150 return 0;
151 }
152 //=========================================================//
153 void* memset(void* dst, int ch, unsigned int size)
154 {
155 int i=0;
156 unsigned char* p=(unsigned char*)dst;
157 while((i<size)&&(*(p+i)=ch))
158 i++;
159 return dst;
160 }
161 //=========================================================//
162 int  memcmp(const void* src1, const void* src2, unsigned int size)
163 {
164 }
165 //=========================================================//
166 void* memchr(const void* dst, int ch, unsigned int size)
167 {
168 }
169 void* memmove(void* dst, const void* src, unsigned int count)
170 {
171 void * ret = dst;
172 if (dst <= src || (char *)dst >= ((char *)src + count))
173 {
174 while (count--)
175 {
176 *(char *)dst = *(char *)src;
177 dst = (char *)dst + 1;
178 src = (char *)src + 1;
179 }
180 }
181 else
182 {
183 dst = (char *)dst + count - 1;
184 src = (char *)src + count - 1;
185 while (count--)
186 {
187 *(char *)dst = *(char *)src;
188 dst = (char *)dst - 1;
189 src = (char *)src - 1;
190 }
191 }
192 return(ret);
193 }
转自: http://www.yqshare.com/string-h-fuction.html

你可能感兴趣的:(手动实现的C语言string.h 头文件的字符串函数)