strsep和strtok

strsep

函數原型:
     
  1. Char * strsep(char **s1, const char *delimt); 
需要注意:
1、         被分割字串要被改變,所以不能操作存放在靜態存儲區的字串常量。
2、        分割符要被替換成’\0’。
3、        需要傳二級指針,因爲s1是指向分割字串,第一次指向源字串,調用後指向分割後的下一個token。所以s1會改變,需要傳遞二級指針。
對於注意1,常犯錯誤如下:
  1. char *str = "This is a example to test the function of strsep";  
  2. strsep(&str, " "); 

str指向的字串是靜態存儲區,屬於字符串常量,不能修改。會出現段錯誤。

而對於注意3,常犯錯誤如下:

 

  1. char str[] = "This is a example to test the function of strsep";  
  2. strsep(&str, " "); 

&str是一級指針,所以也會出現段錯誤。

       其實對於會修改源字串的函數都容易出現上面的錯誤。用時要格外小心注意。

strtok也跟strsep一樣,是用來分割字符串的,但不同的是strtok把待分割字串和遍歷指針分開,並且遍歷指針也是內置的。但是strsep把待分割字串和內置指針整合,所以需要傳二級指針。

函數原型:

  1. char *strtok(char *s1, const char *delim); 

同樣注意上面的錯誤地方。

strtok要對同一字串進行多次分割,第一次需要指定源字串,接下來需要傳NULL;而strsep則不需關心這個問題,因爲它是把待分割字串的二級指針傳過去,內部會進行指針的後移。

strsep使用如下:

 

  1. char *str = strdup("This is a example to test the function of strsep");  
  2. char *p = NULL;  
  3. while(NULL != ( p = strsep(&str, " "))  
  4. {  
  5.     puts(p);  

而strtok使用如下:

第一次要指定待分割字串,接下來則要傳NULL。

  1. char *str = strdup("This is a example to test the function of strsep");  
  2. char *p = NULL;  
  3. char *tmp = str;  
  4. while (NULL != (p = strsep(tmp, " ")))  
  5. {  
  6.     puts(p);  
  7.     tmp = NULL;  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章