c语言字符串操作实现

复试前,用字符串相关的操作来练练手。敲一遍总该用些用处。

  1 #include <stdio.h>
  2 #include <assert.h>
  3 #include <malloc.h>
  4 
  5 int strlen(const char *str)
  6 {
  7     assert(str!=NULL);
  8     int len = 0;
  9     while(*str++)
 10         ++len;
 11     return len;
 12 }
 13 
 14 char *strcpy(char *to, const char *from)
 15 {
 16     assert((to!=NULL)&&(from!=NULL));
 17     char *result = to;
 18     while(*to++ = *from++);
 19     return result;
 20 }
 21 
 22 char *strncpy(char *to, const char *from, size_t count)
 23 {
 24     assert((to!=NULL)&&(from!=NULL));
 25     char *result = to;
 26     while (count--)
 27     {
 28         if (*from)
 29             *to++=*from++;
 30         else
 31         {
 32             *to++='\0';
 33             break;
 34         }
 35     }
 36     return result;
 37 }
 38 
 39 void *memset(void *buffer, int c, size_t count)
 40 {
 41     assert(buffer!=NULL);
 42     char *p = (char *)buffer;
 43     while(count--)
 44         *p++ = (char)c;
 45     return buffer;
 46 }
 47 
 48 char *strchr(char *str, int c)
 49 {
 50     assert(str!=NULL);
 51     for (;*str!=(char)c;++str)
 52     {
 53         if(!(*str))
 54             return NULL;
 55     }
 56     return str;
 57 }
 58 
 59 //need to release the block by hand in your outside code
 60 char *strcat(char *strDes, const char *strSrc)
 61 {
 62     assert((strDes!=NULL)&&(strSrc!=NULL));
 63     char *address = strDes;
 64     int len = 0;
 65     while(*strDes)
 66     {
 67         len++;
 68         strDes++;
 69     }
 70     char *strResult = (char *)malloc(len+1+strlen(strSrc));
 71     char *strRtmp = strResult; 
 72     while(*strResult++=*address++);
 73     strResult--;
 74     while(*strResult++=*strSrc++);
 75     return strRtmp;
 76 }
 77 
 78 
 79 char * strncat(char *strDes, const char *strSrc, unsigned int count)
 80 {
 81     assert((strDes!=NULL)&&(strSrc!=NULL));
 82     char *address = strDes;
 83     while(*strDes)
 84         ++strDes;
 85     while(count--&&*strSrc)
 86         *strDes++=*strSrc++;
 87     *strDes = '\0';
 88     return address;
 89 }
 90 
 91 char *strstr(const char *strSrc, const char *str)
 92 {
 93     assert(strSrc!=NULL&&str!=NULL);
 94     const char *s = strSrc;
 95     const char *t = str;
 96     for (;*strSrc;++strSrc)
 97     {
 98         for(s=strSrc,t=str;*t&&*s==*t;++s,++t);
 99         if(!(*t))
100             return (char *)strSrc;
101     }
102     return NULL;
103 }
104 
105 //need to release the block by hand in your outside code
106 char *strdup(char *strSrc)
107 {
108     if (strSrc!=NULL)
109     {
110         char *start = strSrc;
111         int len = 0;
112         while(*strSrc++)
113             len++;
114         char *address =(char *)malloc(len+1);
115         assert(address!=NULL);
116         while((*address++=*start++));
117         return address-(len+1);
118     }
119     return NULL;
120 }
121 
122 void *memcpy(void *to, const void *from, size_t count)
123 {
124     assert((to!=NULL)&&(from!=NULL));
125     void *result = to;
126     char *pto = (char *)to;
127     char *pfrom = (char *)from;
128     while(count--)
129         *pto++=*pfrom++;
130     return result;
131 }
132 
133 void *memmove(void *to, const void *from, size_t count)
134 {
135     assert((to!=NULL)&&(from!=NULL));
136     void *result = to;
137     char *pto = (char *)to;
138     char *pfrom = (char *)from;
139     assert(pto<pfrom||pto>pfrom+count-1);
140     if(pto<pfrom||pto>pfrom+count-1)
141         while(count--)
142             *pto++ = *pfrom++;
143     else
144     {
145         pto = pto+count-1;
146         pfrom = pfrom+count-1;
147         while(count--)
148             *pto-- = *pfrom--;
149     }
150     return result;
151 }
152 
153 
154 int strcmp(const char *s, const char *t)
155 {
156     assert(s!=NULL&&t!=NULL);
157     while(*s&&*t&&*s==*t)
158     {
159         ++s;++t;
160     }
161     return (*s-*t);
162 }
163 
164 
165 int stricmp(const char *dst, const char *src)
166 {
167     assert(dst!=NULL&&src!=NULL);
168     int ch1, ch2;
169     while (*dst&&*src)
170     {
171         if((ch1=(int)*dst)>='A'&&(ch1<='Z'))
172             ch1+=0x20;
173         if((ch2=(int)*src)>='A'&&(ch2<='Z'))
174             ch2+=0x20;
175         if(ch1==ch2)
176         {
177             ++dst;++src;
178         }
179         else break;
180     }
181     return (ch1-ch2);
182 }
183 
184 
185 int strncmp(const char *s, const char *t, unsigned int count)
186 {
187     assert((s!=NULL)&&(t!=NULL));
188     while (*s&&*t&&*s==*t&&count--)
189     {
190         ++s;++t;
191     }
192     return (*s-*t);
193 }

 

posted on 2013-03-17 12:04  xuangong  阅读(255)  评论(0编辑  收藏  举报

导航