最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言切割多層字符串(strtok_r strtok使用方法)

 更新時(shí)間:2013年11月26日 10:38:08   作者:  
這篇文章主要介紹了C語言切割多層字符串的方法,說了strtok的弱點(diǎn),使用strtok_r的方法

1. strtok介紹

眾所周知,strtok可以根據(jù)用戶所提供的分割符(同時(shí)分隔符也可以為復(fù)數(shù)比如“,?!保?BR>將一段字符串分割直到遇到"\0".

比如,分隔符=“,” 字符串=“Fred,John,Ann”

通過strtok 就可以把3個(gè)字符串 “Fred”      “John”       “Ann”提取出來。

上面的C代碼為

復(fù)制代碼 代碼如下:

int in=0;
char buffer[]="Fred,John,Ann"
char *p[3];
char *buff = buffer;
while((p[in]=strtok(buf,","))!=NULL) {
i++;
buf=NULL; }

如上代碼,第一次執(zhí)行strtok需要以目標(biāo)字符串的地址為第一參數(shù)(buf=buffer),之后strtok需要以NULL為第一參數(shù) (buf=NULL)。指針列p[],則儲(chǔ)存了分割后的結(jié)果,p[0]="John",p[1]="John",p[2]="Ann",而buf就變 成    Fred\0John\0Ann\0。

2. strtok的弱點(diǎn)

讓我們更改一下我們的計(jì)劃:我們有一段字符串 "Fred male 25,John male 62,Anna female 16" 我們希望把這個(gè)字符串整理輸入到一個(gè)struct,

復(fù)制代碼 代碼如下:

struct person {
char [25] name ;
char [6] sex;
char [4] age;
}

要做到這個(gè),其中一個(gè)方法就是先提取一段被“,”分割的字符串,然后再將其以“ ”(空格)分割。
比如: 截取 "Fred male 25" 然后分割成 "Fred" "male" "25"
以下我寫了個(gè)小程序去表現(xiàn)這個(gè)過程:

復(fù)制代碼 代碼如下:

#include<stdio.h>
#include<string.h>
#define INFO_MAX_SZ 255
int main()
{
int in=0;
char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";
char *p[20];
char *buf=buffer;

while((p[in]=strtok(buf,","))!=NULL) {
buf=p[in];
while((p[in]=strtok(buf," "))!=NULL) {
in++;
buf=NULL;
}
p[in++]="***"; //表現(xiàn)分割
buf=NULL; }

printf("Here we have %d strings\n",in);
for (int j=0; j<in; j++)
printf(">%s<\n",p[j]);
return 0;
}

這個(gè)程序輸出為:
Here we have 4 strings
>Fred<
>male<
>25<
>***<
這只是一小段的數(shù)據(jù),并不是我們需要的。但這是為什么呢? 這是因?yàn)閟trtok使用一個(gè)static(靜態(tài))指針來操作數(shù)據(jù),讓我來分析一下以上代碼的運(yùn)行過程:

紅色為strtok的內(nèi)置指針指向的位置,藍(lán)色為strtok對字符串的修改

1."Fred male 25,John male 62,Anna female 16" //外循環(huán)

2."Fred male 25\0John male 62,Anna female 16" //進(jìn)入內(nèi)循環(huán)

3."Fred\0male 25\0John male 62,Anna female 16"

4."Fred\0male\025\0John male 62,Anna female 16"

5 "Fred\0male\025\0John male 62,Anna female 16" //內(nèi)循環(huán)遇到"\0"回到外循環(huán)

6 "Fred\0male\025\0John male 62,Anna female 16" //外循環(huán)遇到"\0"運(yùn)行結(jié)束。

3. 使用strtok_r

在這種情況我們應(yīng)該使用strtok_r, strtok reentrant.
char *strtok_r(char *s, const char *delim, char **ptrptr);

相對strtok我們需要為strtok提供一個(gè)指針來操作,而不是像strtok使用配套的指針。
代碼:

復(fù)制代碼 代碼如下:

#include<stdio.h>
#include<string.h>
#define INFO_MAX_SZ 255
int main()
{
int in=0;
char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";
char *p[20];
char *buf=buffer;

char *outer_ptr=NULL;
char *inner_ptr=NULL;

while((p[in]=strtok_r(buf,",",&outer_ptr))!=NULL) {
buf=p[in];
while((p[in]=strtok_r(buf," ",&inner_ptr))!=NULL) {
in++;
buf=NULL;
}
p[in++]="***";
buf=NULL; }

printf("Here we have %d strings\n",in);
for (int j=0; j<in; j++)
printf(">%s<\n",p[j]);
return 0;
}

這一次的輸出為:
Here we have 12 strings
>Fred<
>male<
>25<
>***<
>John<
>male<
>62<
>***<
>Anna<
>female<
>16<
>***<


讓我來分析一下以上代碼的運(yùn)行過程:

紅色為strtok_r的outer_ptr指向的位置,
紫色為strtok_r的inner_ptr指向的位置,
藍(lán)色為strtok對字符串的修改

1. "Fred male 25,John male 62,Anna female 16" //外循環(huán)
2. "Fred male 25\0John male 62,Anna female 16"http://進(jìn)入內(nèi)循環(huán)
3.   "Fred\0male 25\0John male 62,Anna female 16"
4   "Fred\0male\025\0John male 62,Anna female 16"
5 "Fred\0male\025\0John male 62,Anna female 16" //內(nèi)循環(huán)遇到"\0"回到外循環(huán)
6   "Fred\0male\025\0John male 62\0Anna female 16"http://進(jìn)入內(nèi)循環(huán)

原來, 該函數(shù)修改了原串.

所以,當(dāng)使用char *test2 = "feng,ke,wei"作為第一個(gè)參數(shù)傳入時(shí),在位置①處, 由于test2指向的內(nèi)容保存在文字常量區(qū),該區(qū)的內(nèi)容是不能修改的,所以會(huì)出現(xiàn)內(nèi)存錯(cuò)誤. 而char test1[] = "feng,ke,wei" 中的test1指向的內(nèi)容是保存在棧區(qū)的,所以可以修改

相關(guān)文章

  • opencv利用鼠標(biāo)滑動(dòng)畫出多彩的形狀

    opencv利用鼠標(biāo)滑動(dòng)畫出多彩的形狀

    這篇文章主要為大家詳細(xì)介紹了opencv利用鼠標(biāo)滑動(dòng)畫出多彩的形狀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++淺析析構(gòu)函數(shù)的特征

    C++淺析析構(gòu)函數(shù)的特征

    既然在創(chuàng)建對象時(shí)有構(gòu)造函數(shù)(給成員初始化),那么在銷毀對象時(shí)應(yīng)該還有一個(gè)清除成員變量數(shù)據(jù)的操作咯,析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對象的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作
    2022-07-07
  • C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解

    C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解

    大家好!這期和大家分享整形和浮點(diǎn)型是如何在數(shù)據(jù)是如何在內(nèi)存中存儲(chǔ),下面文章具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 快速學(xué)習(xí)C語言中for循環(huán)語句的基本使用方法

    快速學(xué)習(xí)C語言中for循環(huán)語句的基本使用方法

    這篇文章主要簡單介紹了C語言中for循環(huán)語句的基本使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • C語言深入回顧講解結(jié)構(gòu)體對齊

    C語言深入回顧講解結(jié)構(gòu)體對齊

    C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊
    2022-06-06
  • C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    本文主要介紹了C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 使用C++實(shí)現(xiàn)FTP上傳和下載

    使用C++實(shí)現(xiàn)FTP上傳和下載

    當(dāng)在Windows上使用C++進(jìn)行FTP上傳和下載時(shí),您可以使用libcurl庫來簡化操作,本文將為大家詳細(xì)介紹具體步驟,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C語言與C++中const的用法對比

    C語言與C++中const的用法對比

    C語言中的const與C++有很大的不同,在C語言中用const修飾的變量仍是一個(gè)變量,表示這個(gè)變量是只讀的,不可顯示地更改,而在C++中用const修飾過后,就變成常量了
    2022-04-04
  • C++中的數(shù)據(jù)內(nèi)存分布原理

    C++中的數(shù)據(jù)內(nèi)存分布原理

    這篇文章主要介紹了C++中的數(shù)據(jù)內(nèi)存分布,主要從動(dòng)態(tài)內(nèi)存管理方式,內(nèi)存泄漏等方面介紹的,文中也有相關(guān)的示例代碼,需要的朋友可以參考下
    2023-05-05
  • C++11如何引入的尾置返回類型

    C++11如何引入的尾置返回類型

    C++11 標(biāo)準(zhǔn)引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標(biāo)準(zhǔn)的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下
    2023-01-01

最新評論

叶城县| 徐水县| 绥阳县| 奉化市| 潮安县| 麻栗坡县| 岳阳县| 建平县| 巍山| 思南县| 云梦县| 根河市| 读书| 兴义市| 克什克腾旗| 长寿区| 宁城县| 和平区| 长丰县| 平安县| 通海县| 滦南县| 东辽县| 凤山县| 赤城县| 永修县| 醴陵市| 聂荣县| 潼南县| 合江县| 贵州省| 城口县| 铜陵市| 利川市| 古田县| 广宁县| 鄂州市| 长沙县| 肃宁县| 达日县| 德惠市|