qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          C函數(shù)Strtok,,,,,strcpy詳解

          用途:在s中找出以ct中的字符為分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每調(diào)用一次找到一串,找不到則返回空串。第一次調(diào)用必須傳給它有效的字符串,第二次傳NULL就可以了,每次調(diào)用返回找到的子串的時(shí)候都會(huì)把源串中該子串的尾部字符(原來是搜索串中的某一字符)修改成'/0'字符返回值為每次調(diào)用得到的字串。

              下面看一下它的使用

              char sbody[]= "Presetptz/r/nPreset1=hello/r/nPreset2=ttttt/r/nend/r/n";

              ///char *pbody= "Presetptz/r/nPreset1=hello/r/nPreset2=ttttt/r/nend/r/n";//errror

              char except[] = "12/r/n";

              char *ptoken = NULL;

              ptoken = strtok(sbody,except);

              while(NULL!=ptoken)

              {

              printf("%s/n",ptoken);

              ptoken = strtok(NULL,except);

              }

              輸出為:

              Presetptz

              Preset

              =hello

              Preset

              =ttttt

              end

          下面我們看一下它的源碼:

              char *___strtok;//關(guān)鍵這個(gè)全局指針變量

              char * strtok(char * s,const char * ct)

              {

              char *sbegin, *send;

              sbegin  = s ? s : ___strtok;//不等于NULL用原始字符串,否則用___strtok

              if (!sbegin) {

              return NULL;//結(jié)尾

              }

              sbegin += strspn(sbegin,ct);//

              if (*sbegin == '/0') {

              ___strtok = NULL;

              return( NULL );

              }

              send = strpbrk( sbegin, ct);

              if (send && *send != '/0')

              *send++ = '/0';

              ___strtok = send;

              return (sbegin);

              }

              其中:  ssize_t strspn(const char* s,char*accept)// 返回accept中任一字符在s中第一次出現(xiàn)的位置

              char * strpbrk(const char * cs,const char * ct)//返回指向ct中任一字符在cs中第一次出現(xiàn)的位置

              這個(gè)函數(shù)不難分析,___strtok指針指向除去第一個(gè)有效字串后面的位置,到這里我們應(yīng)該清楚為什么第二次調(diào)用時(shí)只要傳NULL就可以了,當(dāng)然這里也暴露了它的缺點(diǎn),就是說不能有兩個(gè)線程同時(shí)使用strtok否則就會(huì)出現(xiàn)錯(cuò)誤。還有就是我在使用這個(gè)函數(shù)時(shí)碰到的問題,如上面的代碼如果我把sbody換成 pbody,則編譯沒有問題,運(yùn)行時(shí)就會(huì)出錯(cuò),為什么?還是自己的基本功不扎實(shí),pbody在是個(gè)靜態(tài)字符串,說白了,它是在編譯時(shí)就已經(jīng)賦值而且相當(dāng)于是一個(gè)const常量,不能被修改,而strtok是需要修改字符串的,所以產(chǎn)生問題不足為奇。



           原型聲明:extern char *strcpy(char *dest,const char *src);

            頭文件:string.h
            功能:把從src地址開始且含有NULL結(jié)束符的字符串賦值到以dest開始的地址空間
            說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
            返回指向dest的指針

           

          posted on 2012-06-29 12:53 順其自然EVO 閱讀(572) 評(píng)論(0)  編輯  收藏 所屬分類: 性能測(cè)試

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 静乐县| 井研县| 汝城县| 新龙县| 大英县| 耿马| 手机| 涟水县| 莱阳市| 临澧县| 陇川县| 布尔津县| 河间市| 定南县| 怀宁县| 张家港市| 金寨县| 宽城| 永仁县| 竹山县| 仙居县| 双鸭山市| 肃宁县| 远安县| 克东县| 辽宁省| 罗平县| 山西省| 安达市| 玉门市| 巴彦县| 卢氏县| 泾阳县| 成安县| 旌德县| 汝州市| 郁南县| 犍为县| 始兴县| 金川县| 贵州省|