C語言 字串基本操作篇

來源:互聯網
上載者:User
字串基本操作篇
    

     字串的操作對於初學者(me too)來說是必然要掌握的,再這裡主要是要把握數組越界問題。還有就是'\0' 的ASCII就是等於0.

   #define '\0' 0

   #define NULL 0

所以在使用while迴圈時可以不用判斷是否為'\0',或者NULL.

    在這些函數中有一個規律就是當你直接通過指標自加自減操作時使用while迴圈要明顯的簡潔點。當要通過數組下標如i,j等操作時用for迴圈要顯得清楚。

 

      1 int strcmp(const char* str1,const str2) 字串比較函數,如果相等則為0,str1 > str2 則返回大於0的數,如果str1 < str2 則返回小於0的數

 

int strcmp(const char *s1,const char *s2) //因為裡面內部實現是不需要修改指標指向的內容。所以通過const 修飾
{
     assert( s1 != NULL && s2 != NULL );//如果是NULL的情況會出現斷錯誤

 

     while( (*s1 - *s2) == 0 && *s1 != '\0' )
             s1++,s2++;

 

     return *s1 - *s2;
}

     不過本人更加喜歡

 

int strcmp(const char *s1,const char *s2)
{
     assert( s1 != NULL && s2 != NULL );
     int temp = 0;

 

     while( (temp = *s1 - *s2++) == 0 && *s1++ != '\0' );

 

     return temp;
}
 

      2  char* strcpy(char* dest,const char* scr) 這個函數在面試題目中經常出現就是小心dest的範圍

 

char* strcpy(char* dest,const char* scr)
{
    assert (dest != NULL && scr != NULL);
    char *d = dest;

 

    while( *d++ = *scr++ );

 

    return dest;
}
 

       3  char* strncpy(char* dest,const char* src,size_t n) 就是比strcpy 多了個範圍

 

char* strncpy(char* dest,const char* src,size_t n)
{
     assert(dest != NULL && src != NULL);
     char* d = dest;

 

     while(n-- &&  ( *d++ = *src++ ) );//n-- 放前面

 

     return dest;
}

       4  char * strcat(char *dest,const char *src) 字串串連

 

char* strcat(char* dest,const char* src)
{
       assert(dest != NULL && src != NULL);
       char* d = dest + strlen(dest);

 

       while( *d++ = *src++ ) ;

 

       return dest;
}
 

     5  int strlen(const char *s)字串長度函數

 

int strlen(const char* s)
{
      const char* src=s;

       while(*s++);

 

      return s - src - 1;
}
      

       6  char* strchr(const char *s,int c) 搜尋字串中指定的字元

char* strchr(const char* s,int c)
{

      assert(s != NULL);


      while(*s)
      {
          if(*s == (char )c)
              return s;


          s++;
      }

 
     return NULL;
}    

       7  char*  strrchr(const char *s,int c)  搜尋字串中指定字元最後出現的位置這裡的字元類型是int。這個要小心點要同過強制類型轉換來達到目的

 

char* strrchr(const char* s,int c)
{

      assert(s != NULL);
      char* ptr=NULL;

      while( *s )
      {
          if( *s == (char )c )
              ptr = s;


          s++;
      }

      return ptr;
}       


     8  size_t strspn(const char* str,const char* accept) 測試一個字串是否包括另一個字串中的元素,返回第一個不在給定字串中的字元下標,這個實現太巧妙了,這種方法可以用於局部資料的排序,還有這裡的測試特定(局部資料)的數組下標是否出現過,通常都是通過2個迴圈來達到雙重迴圈的效果。

size_t strspn(const char* str,const char* accept)
{
        int i,a[256] = {0};

 

        for(i = 0;accept[i] != '\0';i++)
                a[accept[i]] = 1;

 

        for(i = 0;str[i] != '\0';i++)
                if(a[str[i]] != 1)
                        break;


        return i;
}   


9  char* strstr(const char* str, const char* substr)  測試一個字串中第一次出現子串的位置。。通過指標的自加和數組下標的完美配合來實現

 

char* strstr(const char* str, const char* substr)
{
       int j = 0;

       while(*str != '\0')

       {
             for(j=0;substr[j] != '\0';j++)
                     if(str[j] != substr[j])
                          break;

 

             if(substr[j] == '\0')
                   return str;

            

                 str ++;
        }

 

       return NULL;
}      

 

10   int strncmp(const char* s1,const char* s2,size_t n)  比較前n個

 

int strncmp(const char *s1,const char *s2,size_t n)
{
     assert(n > 0 && s1 != NULL && s2 != NULL );
     int temp = 0;

 

     while( n-- && (temp = *s1 - *s2++) == 0 && *s1++ != '\0' );

 

     return temp;
}

 

11 char *strpbrk(char *str,const char *accept)這個函數的實現和strspn類似不過要簡單點

char *strpbrk(char *str,const char *accept)
{
        int i,a[256]={0};
        for(i=0;accept[i]!='\0';i++)
                a[accept[i]]=1;

        for(i=0;str[i]!='\0';i++)
                if(a[str[i]]==1)
                        return str+i;

 return NULL;
}

 

 12  strtok 還沒實現,等實現了再貼出來

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.