大家都知道strtok函式可以用來對字串進行分割,大大滿足了我們處理字串時候的需求,不需要我們自己再去寫一些分割函式。
首先這個函式的原型為:
char *strtok(char s, const char *delim);
strtok()用來將字串分割成乙個個片段。引數s指向欲分割的字串,引數delim則為分割字串中包含的所有字元。當strtok()在引數s的字串中發現引數delim中包含的分割字元時,則會將該字元改為\0 字元。在第一次呼叫時,strtok()必需給予引數s字串,往後的呼叫則將引數s設定成null。每次呼叫成功則返回指向被分割出片段的指標。
一般使用的**是:
char* temp1;
char* temp2;
temp1 = strtok(s, delim);
if(temp1 != null)
當然如果有多個s中有多個delim分隔符的時候,可以用while迴圈來逐個分割,要注意的是strtok的第乙個引數,除了第一次採用s後,之後全部採用null。
現在回歸正題,從兩個引數分別說一下strtok需要注意的地方是:
1、第乙個引數,char s,這個引數需要注意的是,s字串所在的位址指向的值必須是可修改的,因為strtok函式內部實現中會去先找到delim的位置,然後將delim位置指向的字元修改為'\0',然後逐個取出。
所以如果s位址位於常量區、或者堆區,使用這個函式的時候會發生錯誤。
如下:
char* s = "aa,bb,cc";
char* temp1;
char* temp2;
temp1 = strtok(s, delim);
if(temp1 != null)
由於"aa,bb,cc"是位於堆區的,所以指向','的指標*p,不能再被*p = '\0'。
2、第二個引數delim分隔符在使用的時候,要注意的是都想當然的以為函式在分割字串時完整匹配分隔符delim,比如delim=」ab」,則對於"acdeab」這個字串,函式提取出的是"acde」。至少我在第一次使用的時候也是這麼認為的。其實我們都錯了,我是在看函式的源**時才發現這個問題的,且看下面的例子
int main(void)
}
輸出的結果為:
the character is
:cde
第一次呼叫之後的結果竟然是"cde」,而非我們所想的結果。這是為什麼呢?
我們回到gnu c library中對strtok的功能定義:「parse s into tokens separated by characters in delim」。也就是說包含在delim中的字元均可以作為分隔符,而非嚴格匹配。可以把delim理解為分隔符的集合。這一點是非常重要的
當然,我們在分解字串的時候,很少使用多個分隔符。這也導致,很多人在寫例子的時候只討論了乙個分隔符的情況。有更多的人在看例子的時候也就錯誤的認識了delim的作用。
所以大家使用過程中要多注意了。
C 標準庫函式
有許多不同的案件中,陣列排序的可能是有用的。演算法 如搜尋看看一些存在於乙個陣列 通常可以變得更簡單和 或更有效時,輸入的資料進行排序。此外,排序是非常有用的可讀性,如當列印列表按字母順序排列的名字。排序通常是通過反覆比較的陣列元素對進行的,和交換他們如果他們滿足一些標準。為了在這些元素進行比較根據...
C 標準庫函式
c 程式通常可以呼叫標準c 庫中的大量函式。這些函式完成一些基本的服務,如輸入和輸出等,同時也為一些經常使用的操作提供了高效的 實現 這些函式中含有大量的函式和類定義,以幫助程式設計師更好地使用標準c 庫。標準c 庫包含以下內容 和 標準c 庫的詳細訊息均在其對應的標頭檔案進行了說明。主要標準c 庫...
字串庫函式 strtok
string.h 中定義 char strtok char str,const char delim 當strtok 在引數str的字串中發現引數delim中包涵的分割字元時,則會將該字元改為 0 字元。在第一次呼叫時,strtok 必需給予引數str字串,往後的呼叫則將引數str設定成null。每...