strsep
函數原型:
- Char * strsep(char **s1, const char *delimt);
需要注意:
1、 被分割字串要被改變,所以不能操作存放在靜態存儲區的字串常量。
2、 分割符要被替換成’\0’。
3、 需要傳二級指針,因爲s1是指向分割字串,第一次指向源字串,調用後指向分割後的下一個token。所以s1會改變,需要傳遞二級指針。
對於注意1,常犯錯誤如下:
- char *str = "This is a example to test the function of strsep";
- strsep(&str, " ");
str指向的字串是靜態存儲區,屬於字符串常量,不能修改。會出現段錯誤。
而對於注意3,常犯錯誤如下:
- char str[] = "This is a example to test the function of strsep";
- strsep(&str, " ");
&str是一級指針,所以也會出現段錯誤。
其實對於會修改源字串的函數都容易出現上面的錯誤。用時要格外小心注意。
strtok也跟strsep一樣,是用來分割字符串的,但不同的是strtok把待分割字串和遍歷指針分開,並且遍歷指針也是內置的。但是strsep把待分割字串和內置指針整合,所以需要傳二級指針。
函數原型:
- char *strtok(char *s1, const char *delim);
同樣注意上面的錯誤地方。
strtok要對同一字串進行多次分割,第一次需要指定源字串,接下來需要傳NULL;而strsep則不需關心這個問題,因爲它是把待分割字串的二級指針傳過去,內部會進行指針的後移。
strsep使用如下:
- char *str = strdup("This is a example to test the function of strsep");
- char *p = NULL;
- while(NULL != ( p = strsep(&str, " "))
- {
- puts(p);
- }
而strtok使用如下:
第一次要指定待分割字串,接下來則要傳NULL。
- char *str = strdup("This is a example to test the function of strsep");
- char *p = NULL;
- char *tmp = str;
- while (NULL != (p = strsep(tmp, " ")))
- {
- puts(p);
- tmp = NULL;
- }