qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

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

          用途:在s中找出以ct中的字符為分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每調(diào)用一次找到一串,找不到則返回空串。第一次調(diào)用必須傳給它有效的字符串,第二次傳NULL就可以了,每次調(diào)用返回找到的子串的時候都會把源串中該子串的尾部字符(原來是搜索串中的某一字符)修改成'/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)鍵這個全局指針變量

              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)的位置

              這個函數(shù)不難分析,___strtok指針指向除去第一個有效字串后面的位置,到這里我們應(yīng)該清楚為什么第二次調(diào)用時只要傳NULL就可以了,當(dāng)然這里也暴露了它的缺點,就是說不能有兩個線程同時使用strtok否則就會出現(xiàn)錯誤。還有就是我在使用這個函數(shù)時碰到的問題,如上面的代碼如果我把sbody換成 pbody,則編譯沒有問題,運行時就會出錯,為什么?還是自己的基本功不扎實,pbody在是個靜態(tài)字符串,說白了,它是在編譯時就已經(jīng)賦值而且相當(dāng)于是一個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) 評論(0)  編輯  收藏 所屬分類: 性能測試

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 拜泉县| 赤水市| 新干县| 博湖县| 成安县| 普兰县| 大理市| 洪雅县| 昌图县| 巴楚县| 涡阳县| 民权县| 勐海县| 达孜县| 福安市| 新化县| 巧家县| 弥渡县| 天等县| 普格县| 富蕴县| 岳西县| 沁源县| 葵青区| 陵川县| 名山县| 商城县| 四子王旗| 南乐县| 通榆县| 贡山| 林口县| 霍州市| 湘潭市| 静安区| 郑州市| 明星| 祁门县| 平塘县| 互助| 岳西县|