91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字符串函數番外篇

發布時間:2020-06-22 23:18:45 來源:網絡 閱讀:353 作者:我是你帆哥 欄目:編程語言

   通常看到strrchr這個函數,人們很自然的想問庫里面有沒有strrstr這個函數呢???

   答案是:沒有。

   但是我們可以自己實現一個strrstr函數,它的功能是查找最后一次出現的子字符串,如果找打則返回這個地址,如果沒找到則返回空地址。


  實現方案:對于這個函數有兩種實現方式。

    第一種是從后向前找,第一次找到就返回這個地址。

    第二種是從前向后找,用一個標簽記錄第一次找到的位置,然后當第二次找到時再更新這個標簽,最后標簽里面保存的地址就是我們要找的地址。


從后向前找:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

char *my_strrstr(const char *dst, const char *src)
{
    assert(dst );                      //對字符串進行斷言,判斷是否為空
    assert(src );
    const char *pdst = dst;         
    const char *psrc = src;
    char *tmp = NULL ;               
    while (*pdst)                          //因為要從后向前找,則首先讓pdst指向'\0'
    {
       pdst++;
     }
     
    while (pdst >= dst )                     //當pdst大于dst則表明dst這個字符串還沒有找完
    {
        if (tmp=(char *)strstr(pdst, psrc = src))  //使用strstr幫助尋找,找到保存到tmp
        return tmp;
        
        pdst--;
     }
     
     return NULL ;
}



int main()
{
    char arr[30];
    char arr1[20];
    scanf( "%s%s", arr, arr1);
    char *ret=my_strrstr(arr, arr1);
    printf( "%#p\n", ret);
    system( "pause");
    return 0;
}


//當字符串很大時,效率很高



從前向后找:

char *my_strrstr(const char *dst, const char *src)
{
      assert(dst );
      assert(src );
      const char *pdst = dst;
      const char *psrc = src;
      char *right= NULL ;
      while (*dst )
      {
            while (*pdst == *psrc)
            {
                if (*pdst== '\0' )               //如果pdst指向'\0'則表明目標數組已經找完
                     return right=(char *)dst;
                else
                {
                    pdst++;
                    psrc++;
                 }
             }
             
             if (*psrc == '\0' )      //src已經則dst中出現,將這個地址保存起來
                right = (char *)dst ;
                
             pdst = ++ dst;
             psrc = src;
        }
        
       return right;
}

int main()
{
     char arr1[50] = { 0 };
     char arr2[40] = { 0 };
     char *place = NULL ;
     scanf( "%s%s",arr1, arr2);
     place = my_strrstr(arr1, arr2);
     printf( "%#p\n",place);
     system( "pause");
     return 0;
}

//當目標字符串很大時,效率特別低




strtok:

   功能: 可以將一個字符串按照分隔符分開讀取


   原型: char * strtok(char *str,const char *sep);

          str是要讀取的字符串,這個字符串里面包含了若干sep中的字符。sep指向分隔符字符串。strtok找到str中下一個標記,并用'\0'替換。


    用法:

        例:arr[]="ab@cd#ef$gh#"; sep[]="@#$".

            將str按照sep中出現的分隔符分隔開來。如果參數arr非空,則strtok將找到第一個標記,將它賦成‘\0',并保存它的下一個位置。


               第一次調用strtok(arr,sep);返回首地址,保存c的地址。


               第二次調用strtok(NULL,sep);str參數為NULL,則strtok從c的位置尋找下一個分隔符。也就是找到#后將#換成'\0'并返回c的地址。


              此后再調用strtok和第二次類似:如果str參數為NULL,則strtok就在同一個字符串中從上次保存的位置尋找下一個分隔符。

strtok實現:

char *my_strtok(char *dst, char const * sep)
{
     assert(dst );               //斷言字符串是否為空
     assert(sep );
     static char *pdst=NULL;    //聲明一個靜態局部變量
     char *origin = NULL ;    
     if (dst )
       pdst = dst;
     origin = pdst;                  //記錄起始位置
     
     while( !strchr(sep , *pdst)||*pdst)      //尋找分隔符,當遇到'\0'程序結束
     {
         pdst++;
      }
      
      if (*pdst)                   //如果找到分隔符
           *pdst++ = '\0';               //將分隔符換成'\0'
      return origin;              
}
int main()
{
     char *ret = NULL ;
     char arr[20];
     char *arr1="@#$" ;
     scanf( "%s", arr);
     for (ret = strtok(arr, arr1); ret != NULL; ret = strtok( NULL, arr1))
          printf( "%s\n", ret);
      system( "pause");
      return 0;
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉林省| 江北区| 中西区| 洛扎县| 丽江市| 长沙市| 平原县| 白银市| 错那县| 娄烦县| 宜昌市| 海城市| 全州县| 大庆市| 涟源市| 盈江县| 藁城市| 东乡县| 泸溪县| 文登市| 黄梅县| 屏南县| 崇仁县| 平和县| 开原市| 云和县| 淮南市| 阜康市| 岳池县| 雷州市| 延庆县| 灌阳县| 页游| 电白县| 溧阳市| 梁河县| 犍为县| 农安县| 昭觉县| 大兴区| 正蓝旗|