strtok.c
原型:char *strtok(char *s, char *delim);
功能:分解字符串為一組字符串。s為要分解的字符串,delim為分隔符字符串。
說明:首次調用時,s指向要分解的字符串,之后再次調用要把s設成NULL。
strtok在s中查找包含在delim中的字符并用NULL('\0')來替換,直到找遍整個字符串。
返回值:從s開頭開始的一個個被分割的串。當沒有被分割的串時則返回NULL。
所有delim中包含的字符都會被濾掉,并將被濾掉的地方設為一處分割的節(jié)點。
#include <string.h> #include <stdio.h>char string[] = "A string of,tokens and some more tokens";//要分解的字符串 char seps[] = " "; //分隔符字符集的字符串 char *token;void main( void ) {printf( "%s\n\nTokens:\n", string );/* Establish string and get the first token: */token = strtok( string, seps ); //分解字符串為一組字符串while( token != NULL ){/* While there are tokens in "string" */printf( " %s\n", token );/* Get next token: */token = strtok( NULL, seps );//首次調用時,第一個參數(shù)string指向要分解的字符串,之后再次調用要把s設成NULL} }
函數(shù)原型:char *strtok(char *s, char *delim);
函數(shù)功能:把字符串s按照字符串delim進行分割,然后返回分割的結果。
函數(shù)使用說:
1.strtok函數(shù)的實質上的處理是,strtok在s中查找包含在delim中的字符并用NULL(’\0′)來替換,直到找遍整個字符串。這句話有兩層含義:(1)每次調用strtok函數(shù)只能獲得一個分割單位。(2)要獲得所有的分割單元必須反復調用strtok函數(shù)。
2.strtok函數(shù)以后的調用時的需用NULL來替換s.
3.形參s(要分割的字符串)對應的變量應用char s[]=”….”形式,而不能用char *s=”….”形式。
例子如下:
#include <stdio.h> #include <string.h> void main() { char buf[]=”Golden Global View”; char* token = strtok( buf, ” “); while( token != NULL ) { printf( ”%s “, token ); token = strtok( NULL, ” “); } return 0; }
其結果為:
Golden
Global
View
但是如果我們把char buf[]=”Golden Global View”;換成char *buf=”Golden Global View”; 則會出錯,原因我還沒找到,如果有人發(fā)現(xiàn)了原因望告知于我。
如果我們把token = strtok( NULL, ” “);換成token = strtok( buf, ” “);則while循環(huán)會成為一個無限循環(huán),而輸出的結果就只為:Golden。我的解釋原因如下:
在strtok函數(shù)體中有一個char 類型的指針(假設為 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在隨后的處理中指針p的值會一直保存(C語言中指針的特點),因此在以后的strtok調用中用NULL來代替s的原因就是防止p被重新賦值而指向s的起始地址,從而可以保證p可以指向s的其他位置,直到最后分割完整個字符串。
但是如果用s來代替NULL,那么每次調用strtok時,p就會指向s的初始地址,從而只能獲得第一個分割出來的字串,如上面的例子中while會是一個無限循環(huán),而輸出的結果只能是“Golden”。
總結
- 上一篇: 【✨十五天搞定电工基础】正弦交流电路的分
- 下一篇: JAVA 对象数组和空指针异常