寫幾個字串演算法

來源:互聯網
上載者:User

1、實現strstr函數

函數原型是char *strstr(char *str1,char *str2);作用是找出str2字串在str1字串中第一次出現的位置(不包括str2的串結束符)
如果找到返回該位置的指標。若找不到,返回NULL指標。

const char * pstrstr(const char *haystack, const char *needle)<br />{<br /> const char *p1, *p2;</p><p> p1 = haystack;<br /> p2 = needle;<br /> while (*haystack != '/0' && *needle != '/0')<br /> {<br /> if (*haystack++ != *needle++) {<br /> needle = p2;<br /> haystack = ++p1; //從下一個字元開始搜尋needle<br /> }<br /> }<br /> if (*needle == '/0')<br /> return p1;<br /> return NULL;<br />}  

2、實現strcpy函數

 

char *strcpy(char *dest,char *src); 功能:把src所指由NULL結束的字串複製到dest所指的數組中。說明:src和dest所指記憶體地區不可以重疊且dest必須有足夠的空間來容納src的字串。src字串尾的字串結束標識符'/0'也會被複製過去,複製完成後s1中的內容會被覆蓋掉
char * strcpy( char *strDest, const char *strSrc ) {    assert( (strDest != NULL) && (strSrc != NULL) );    char *address = strDest;     while( (*strDest++ = * strSrc++) != '/0' );     return address;} 
char *strncpy(char *strDes, const char *strSrc, unsigned int count)      {          assert(strDes != NULL && strSrc != NULL);          char *address = strDes;          while (count-- && *strSrc != '/0')              *strDes++ = *strSrc++;       *strDes = '/0';      return address;      }     //尋找字串s中首次出現字元c的位置   char *strchr(const char *str, int c)   {       assert(str != NULL);       for (; *str != (char)c; ++ str)           if (*str == '/0')               return NULL;           return str;   }     int strcmp(const char *s, const char *t)   {       assert(s != NULL && t != NULL);       while (*s && *t && *s == *t)       {           ++ s;           ++ t;       }       return (*s - *t);   }     char *strcat(char *strDes, const char *strSrc)   {       assert((strDes != NULL) && (strSrc != NULL));       char *address = strDes;       while (*strDes != '/0')           ++ strDes;       while ((*strDes ++ = *strSrc ++) != '/0')           NULL;       return address;   }     int strlen(const char *str)   {       assert(str != NULL);       int len = 0;       while (*str ++ != '/0')           ++ len;       return len;   }     //此函數,夢修改如下     char *strdup_(char *strSrc)     //將字串拷貝到新的位置     {         if(strSrc!=NULL)         {             char *start=strSrc;             int len=0;             while(*strSrc++!='/0')                 len++;                       char *address=(char *)malloc(len+1);             assert(address != NULL);                    while((*address++=*start++)!='/0');              return address-(len+1);          }         return NULL;     }       //多謝laoyi19861011指正  char *strstr(const char *strSrc, const char *str)   {       assert(strSrc != NULL && str != NULL);       const char *s = strSrc;       const char *t = str;       for (; *strSrc != '/0'; ++ strSrc)       {           for (s = strSrc, t = str; *t != '/0' && *s == *t; ++s, ++t)               NULL;           if (*t == '/0')               return (char *) strSrc;       }       return NULL;   }     char *strncpy(char *strDes, const char *strSrc, unsigned int count)      {          assert(strDes != NULL && strSrc != NULL);          char *address = strDes;          while (count -- && *strSrc != '/0')              *strDes ++ = *strSrc ++;          *strDes = '/0';      return address;      }          char *strncat(char *strDes, const char *strSrc, unsigned int count)   {       assert((strDes != NULL) && (strSrc != NULL));       char *address = strDes;       while (*strDes != '/0')           ++ strDes;       while (count -- && *strSrc != '/0' )           *strDes ++ = *strSrc ++;       *strDes = '/0';       return address;   }     int strncmp(const char *s, const char *t, unsigned int count)   {       assert((s != NULL) && (t != NULL));       while (*s && *t && *s == *t && count --)       {           ++ s;           ++ t;       }       return (*s - *t);   }     char *strpbrk(const char *strSrc, const char *str)   {       assert((strSrc != NULL) && (str != NULL));       const char *s;       while (*strSrc != '/0')       {           s = str;           while (*s != '/0')           {               if (*strSrc == *s)                   return (char *) strSrc;               ++ s;           }           ++ strSrc;       }       return NULL;   }     int strcspn(const char *strSrc, const char *str)   {       assert((strSrc != NULL) && (str != NULL));       const char *s;       const char *t = strSrc;       while (*t != '/0')       {           s = str;           while (*s != '/0')           {               if (*t == *s)                   return t - strSrc;               ++ s;           }           ++ t;       }       return 0;   }     int strspn(const char *strSrc, const char *str)   {       assert((strSrc != NULL) && (str != NULL));       const char *s;       const char *t = strSrc;       while (*t != '/0')       {           s = str;           while (*s != '/0')           {               if (*t == *s)                   break;               ++ s;           }           if (*s == '/0')               return t - strSrc;           ++ t;       }       return 0;   }     char *strrchr(const char *str, int c)   {       assert(str != NULL);       const char *s = str;       while (*s != '/0')           ++ s;       for (-- s; *s != (char) c; -- s)           if (s == str)               return NULL;           return (char *) s;   }     char* strrev(char *str)   {       assert(str != NULL);       char *s = str, *t = str, c;       while (*t != '/0')           ++ t;       for (-- t; s < t; ++ s, -- t)       {           c = *s;           *s = *t;           *t = c;       }       return str;   }     char *strnset(char *str, int c, unsigned int count)   {       assert(str != NULL);       char *s = str;       for (; *s != '/0' && s - str < count; ++ s)           *s = (char) c;       return str;   }     char *strset(char *str, int c)   {       assert(str != NULL);       char *s = str;       for (; *s != '/0'; ++ s)           *s = (char) c;       return str;   }     char *strtok(char *strToken, const char *str)   {       assert(strToken != NULL && str != NULL);       char *s = strToken;       const char *t = str;       while (*s != '/0')       {           t = str;           while (*t != '/0')           {               if (*s == *t)               {                   *(strToken + (s - strToken)) = '/0';                   return strToken;               }               ++ t;           }           ++ s;       }       return NULL;   }     char *strupr(char *str)   {       assert(str != NULL);       char *s = str;       while (*s != '/0')       {           if (*s >= 'a' && *s <= 'z')               *s -= 0x20;           s ++;       }       return str;   }     char *strlwr(char *str)   {       assert(str != NULL);       char *s = str;       while (*s != '/0')       {           if (*s >= 'A' && *s <= 'Z')               *s += 0x20;           s ++;       }       return str;   }     void *memcpy(void *dest, const void *src, unsigned int count)   {       assert((dest != NULL) && (src != NULL));       void *address = dest;       while (count --)       {           *(char *) dest = *(char *) src;           dest = (char *) dest + 1;           src = (char *) src + 1;       }       return address;   }     void *memccpy(void *dest, const void *src, int c, unsigned int count)   {       assert((dest != NULL) && (src != NULL));       while (count --)       {           *(char *) dest = *(char *) src;           if (* (char *) src == (char) c)               return ((char *)dest + 1);           dest = (char *) dest + 1;           src = (char *) src + 1;       }       return NULL;   }     void *memchr(const void *buf, int c, unsigned int count)   {       assert(buf != NULL);       while (count --)       {           if (*(char *) buf == c)               return (void *) buf;           buf = (char *) buf + 1;       }       return NULL;   }     int memcmp(const void *s, const void *t, unsigned int count)   {       assert((s != NULL) && (t != NULL));       while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)       {           s = (char *) s + 1;           t = (char *) t + 1;       }       return (*(char *) s - *(char *) t);   }   void *memmove(void *dest, const void *src, unsigned int count)   {      assert(dest != NULL && src != NULL);      char* pdest = (char*) dest;      char* psrc = (char*) src;            //pdest在psrc後面,且兩者距離小於count時,從尾部開始移動. 其他情況從頭部開始移動      if (pdest > psrc && pdest - psrc < count)       {          while (count--)           {              *(pdest + count) = *(psrc + count);          }      } else       {          while (count--)           {              *pdest++ = *psrc++;          }      }      return dest;  }    void *memset(void *str, int c, unsigned int count)   {       assert(str != NULL);       void *s = str;       while (count --)       {           *(char *) s = (char) c;           s = (char *) s + 1;       }       return str;   }  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.