【C語言】淺談strtok()與NULL

來源:互聯網
上載者:User

標籤:c語言   strtok函數   null   

一、strtok(  )函數

strtok(  )函數包含於標頭檔string.h

文法:char *strtok( char *str1, const char *str2 ); 

功能:函數返回字串str1中緊接“標記”的部分的指標, 字串str2是作為標記的分隔字元。如果分隔標記沒有找到,函數返回NULL。為了將字串轉換成標記,第一次調用str1 指向作為標記的分隔字元。之後所以的調用str1 都應為NULL


二、代碼

#include<stdio.h>#include<string.h>int main(){char p[]="My name is XiaoMing.";char tmp[20];char *sep=" ";char *token=NULL;strcpy(tmp,p);for(token=strtok(tmp,sep);token != NULL;token=strtok(NULL,sep)){printf("%s\n",token);}return 0;}



三、運行結果




四、淺談strtok( )函數與NULL

函數strtok( char *str1, const char *str2 ) 涉及到兩個指標。

第一個指標pointer_a用來指向函數返回的字串,這個字串是被原字串OriginalString被seps中的字元截斷後的第一個字串。

第二個指標pointer_b用來指向OriginalString中,匹配截斷字串seps的位置。

如果在第二次函數調用的時候,第一個參數不是設定為NULL而是設為原來的字串"My name is XiaoMing.",那麼講永遠返回"My"並且也將陷入死迴圈。

為何會出現這種結果呢?

原因是:

第一次調用這個函數是在while迴圈體之外(第19行),此時,字串"My name is XiaoMing." 中匹配token(即參數seps代表的各種字元,如本例中," ,/t/n"表示空格,逗號,定位字元,分行符號這四種字元)中所指定的字元的位置在My和name之間。於是,函數的返回值pointer_a為一個指向”My”的指標。此時,pointer_b指向My和name之間的位置,代表pointer_b之前的位置已經進行過尋找匹配了。

這樣,在迴圈體之內進行第二次函數調用的時候,只要把strtok()的第一個參數設定為NULL,就可以直接從pointer_b位置開始進行尋找匹配了。

所以,NULL的作用只是為了使得每次調用時,都不是從"My name is XiaoMing."的頭開始,而是從上次調用時尋找所停止的位置開始,如此迴圈下去,直到無法再找到匹配token的時候位置,這樣就實現了把"My name is XiaoMing."按照token進行分隔的效果。


【C語言】淺談strtok()與NULL

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.