一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

有意思的字符串查找函數(shù)strchr,strrchr,strstr,strrstr

 筱肆 2020-03-06

      通過一段時間對字符串的了解,我發(fā)現(xiàn)了許多有意思的字符串函數(shù),下面我們就以常見的字符串查找函數(shù):strchr,strrchr,strstr,strrstr為例來模擬實現(xiàn)這些有意思的字符串查找函數(shù)吧!

 【strchr】【strrchr】

        查找一個字符,有所不同的是:strchr用于查找這個字符第一次出現(xiàn)的位置,strrchr用于查找這個字符最后一次出現(xiàn)的位置.下面我們就來打開MSDN來查找這兩個字符查找函數(shù)的函數(shù)原型:

   char *strchr(const char *string,int c)

   char *strrchr(const char *string,int c)

        需要注意的是:這兩個函數(shù)的第二個參數(shù)是一個整型值,但是它卻包含了一個字符值,為字符在計算機內(nèi)存中都是存儲的是它的ASC||值,當(dāng)定義為整形時反而提高了它的存儲范圍。

      下面我們先給出程序的測試代碼:

    

  1. int main()
  2. {
  3. char ch=0;
  4. char *ret=NULL;
  5. char arr[]="feabadc";
  6. printf("請輸入一個你要查找的字符:");
  7. scanf("%c",&ch);
  8. ret=my_strchr(arr,ch);
  9. printf("%s\n",ret);
  10. system("pause");
  11. return 0;
  12. }

        

     對于strchr我們知道它是一個查找一個字符第一次出現(xiàn)的函數(shù),找到后返回一個指向該位置的指針,下面我們就來實現(xiàn)一個查找字符的函數(shù):strchr.

       

  1. char *my_strchr(char *str,char ch)
  2. {
  3. assert(str);
  4. while(*str != '\0')
  5. {
  6. if(*str == ch)
  7. return str;
  8. str++;
  9. }
  10. return 0;
  11. }




       下面我們就來驗證這個函數(shù):

       

      我們發(fā)現(xiàn)對于字符串“feabadc”,a這個字符出現(xiàn)了兩次,那仫如果我們用strchr來查找字符a返回的是第一個a和他之后的字符,但是如果我們用strrchr來查找這個字符串呢?又會出現(xiàn)什仫結(jié)果?下面我們就來實現(xiàn)這個函數(shù):strrchr

     

         

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<assert.h>
  6. char *my_strrchr(char *str,char ch)
  7. {
  8. char *ptr=NULL;
  9. assert(str);
  10. while(*str != '\0')
  11. {
  12. if(*str == ch)
  13. ptr=str;
  14. str++;
  15. }
  16. if(ptr != 0)
  17. return ptr;
  18. return 0;
  19. }
  20. int main()
  21. {
  22. char ch=0;
  23. char *ret=NULL;
  24. char arr[]="feabadc";
  25. printf("請輸入一個你要查找的字符:");
  26. scanf("%c",&ch);
  27. ret=my_strrchr(arr,ch);
  28. printf("%s\n",ret);
  29. system("pause");
  30. return 0;
  31. }


      那仫這個函數(shù)的結(jié)果又是什仫呢?請繼續(xù)向下看吐舌頭

     

      看對于同一個字符串"feabadc",我們使用不同的查找函數(shù)查找其中的字符‘a(chǎn)’我們得到了不一樣的結(jié)果??吹竭@里我們是不是對strchr和strrchr有了更加深入的了解呢?那是肯定的啦!如果我們查找的是一個子串呢?下面我們就來看另一組字符串查找函數(shù):strstr,strrstr.

【strstr】【strrstr】

       在字符串中查找子串,我們可以使用strstr,它的函數(shù)原型為:

  char *strstr(const char *s1,const char *s2)

      和上面類似,strstr雖然是用來查找子串的但是它是在s1中查找第一次出現(xiàn)s2的起始位置,并返回一個指向該位置的指針,下面我們就來實現(xiàn)這個函數(shù)strstr.

      

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<assert.h>
  5. char *my_strstr(char *dest,char *src)
  6. {
  7. char *ptr=NULL;
  8. char *str1=dest;
  9. char *str2=src;
  10. assert(dest);
  11. assert(dest);
  12. while(*str1 != '\0')
  13. {
  14. ptr=str1;
  15. while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
  16. {
  17. str1++;
  18. str2++;
  19. }
  20. if(*str2 == '\0')
  21. return (char *)ptr;
  22. str1=ptr+1;
  23. str2=src;
  24. }
  25. return 0;
  26. }
  27. int main()
  28. {
  29. char *ret=NULL;
  30. char arr1[]="i love you forever";
  31. char *arr2="ve";
  32. ret=my_strrstr(arr1,arr2);
  33. printf("%s\n",ret);
  34. system("pause");
  35. return 0;
  36. }

        它的結(jié)果如下:

       

        對于字符串"i love you forever"它里面存在兩個子串"ve",而我們使用strstr函數(shù)之后返回的是第一個"ve"出現(xiàn)的指針位置,類似上述strchr和strrchr是不是也存在一個strrstr函數(shù)可以查找第二次出現(xiàn)'ve'的位置呢?但是打開MSDN后庫里卻沒有這個函數(shù),是不是這個函數(shù)我們就不能使用呢?下面我們就來實現(xiàn)這個查找第二次出現(xiàn)子串的函數(shù)。

       方法一:自定義實現(xiàn)strrstr

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<assert.h>
  5. // i love you fore ver ve
  6. char *my_strrstr(char *dest,char *src)
  7. {
  8. char *first=NULL;
  9. char *second=NULL;
  10. char *str1=dest;
  11. char *str2=src;
  12. assert(dest);
  13. assert(src);
  14. while((*str1 != '\0'))
  15. {
  16. first=str1; //記錄下一次比較的起始位置
  17. while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
  18. {
  19. str1++;
  20. str2++;
  21. }
  22. if(*str2 == '\0')
  23. second=first; //從第一次查找到子串的位置后繼續(xù)查找
  24. str1=first+1;
  25. str2=src;
  26. }
  27. if(*str1 == '\0')
  28. return second;
  29. return 0;
  30. }
  31. int main()
  32. {
  33. char *ret=NULL;
  34. char arr1[]="i love you forever";
  35. char *arr2="ve";
  36. ret=my_strrstr(arr1,arr2);
  37. printf("%s\n",ret);
  38. system("pause");
  39. return 0;
  40. }

        方法二:通過調(diào)用strstr來實現(xiàn)strrstr,測試函數(shù)同方法一

        

  1. char *my_strrstr(const char *dest,const char *src)
  2. {
  3. const char *ret=NULL;
  4. const char *last=NULL;
  5. assert(dest);
  6. assert(src);
  7. if(*src == '\0')
  8. return (char *)dest;
  9. while(ret=my_strstr(dest,src))
  10. {
  11. last=ret;
  12. dest=ret+1;
  13. }
  14. return (char *)last;
  15. }

          那仫這個特殊的函數(shù)strrstr它的結(jié)果是不是我們預(yù)想的呢?當(dāng)然啦!下面我們就來運行一下它:

       

        我們發(fā)現(xiàn)確實和我們開始預(yù)想的一樣,神奇的strrstr果然沒有辜負(fù)我們的厚望大笑,通過模擬實現(xiàn)一些字符串的庫函數(shù),可以讓我們更好的了解字符串庫函數(shù)的實現(xiàn),當(dāng)然字符串還有許多功能強大的庫函數(shù)有待大家自己用MSDN了解和使用,以上就是我個人對字符串查找?guī)旌瘮?shù)的一些理解,比較粗糙希望大家多多理解啦!微笑

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久夜色精品国产高清不卡| 欧美日韩国产午夜福利| 亚洲国产日韩欧美三级| av在线免费观看在线免费观看| 亚洲免费黄色高清在线观看| 日本丰满大奶熟女一区二区| 中国少妇精品偷拍视频| 国产精品日本女优在线观看| 欧美多人疯狂性战派对| 欧美性高清一区二区三区视频| 日韩在线免费看中文字幕| 国产精品人妻熟女毛片av久| 国产精品激情在线观看| 草草草草在线观看视频| 久久少妇诱惑免费视频| 扒开腿狂躁女人爽出白浆av | 激情内射日本一区二区三区| 日韩精品视频一二三区| 国产成人精品国内自产拍| 视频一区二区 国产精品| 黄色av尤物白丝在线播放网址| 午夜激情视频一区二区| 色婷婷日本视频在线观看| 精品午夜福利无人区乱码| 国产又色又爽又黄又免费| 精品伊人久久大香线蕉综合 | 九九热在线免费在线观看| 四季精品人妻av一区二区三区| 久久精品伊人一区二区| 少妇激情在线免费观看| 亚洲欧美日本国产不卡| 尹人大香蕉中文在线播放| 91人妻丝袜一区二区三区| 日本福利写真在线观看| 观看日韩精品在线视频| 国产熟女一区二区三区四区| 日韩色婷婷综合在线观看| 亚洲熟妇中文字幕五十路| 亚洲免费黄色高清在线观看| 夫妻激情视频一区二区三区| 国产精品欧美一区二区三区不卡|