字符分割函数strtok
生活随笔
收集整理的這篇文章主要介紹了
字符分割函数strtok
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分割函數strtok
- 一、strtok()基本使用和介紹
- 二、strtok()注意事項
- 三、strtok()函數源碼
一、strtok()基本使用和介紹
1、函數原型
char *strtok(char *str, const char *delim)2、參數
- str—要被分解的字符串
- delim—用作分隔符的字符(可以是一個,也可以是集合)
3、返回值
- 該函數返回被分解的第一個子字符串,若無可檢索的字符串,則返回空指針
4、實例代碼
#include <string.h> #include <stdio.h>int main () {char str[80] = "aaa - bbb - ccc";const char s[2] = "-"; //字符串里可以是一個分隔符,也可以是分隔符的集合char *token;/* 獲取第一個子字符串 */token = strtok(str, s);/* 繼續獲取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0); }編譯運行
在這里我們可以看出strtok的基本使用方法:
第一次調用strtok(),傳入的參數str是要被分割的字符串{aaa - bbb -ccc},而成功后返回的是第一個子字符串{aaa};
而第二次調用strtok的時候,傳入的參數應該為NULL,使得該函數默認使用上一次未分割完的字符串繼續分割 ,就從上一次分割的位置{aaa-}作為本次分割的起始位置,直到分割結束。
二、strtok()注意事項
(1)delim 替換成 \0
- 在這個函數里strtok()在分解字符串的時候,第一個參數str是在不斷變化的,這個函數是在改變原字符串,把原字符串{aaa - bbb - ccc}通過第二個參數delim將所有的分割符{-}替換成字符串結束標志字符{\0},則原字符串變化為{aaa \0 bbb \0 ccc}
- 錯誤示例:
注意:在這里,我實現函數的時候將字符串數組直接用指針指向它了,結果運行錯誤,后面發現雖然第一個參數是可以傳指針,但我們要考慮空間內存布局,在strtok()函數里是delim的{分隔符}替換{ \0}改變原字符串,而我們用指針指向這個字符串的時候,其實指向的是字符串常量,它的內存分布在文字常量區是不可被改變的,所以出現了錯誤!
(2)delim分隔符
- strtok()的第二個參數delim,我看了很多博客都使用一個分隔符的示例,其實delim里可以是所有分隔符的集合,比如{aaa - bbb ; ccc | ddd},第二個參數delim可以是{-;|},用一個或多個分隔符去分解字符串都可以
(3)delim分隔符可不可以出現在第一個字符?
- 答案是:可以
當strtok分解的字符串首字符就是分隔符,那么strtok()會忽略首個分隔符,直接從第二個分隔符往下繼續分解,例如:{- aaa - bbb - ccc} 那么strtok()會忽略第一個{-},還是以{aaa - bbb - ccc}的字符串形式繼續分解。
三、strtok()函數源碼
有的小伙伴可能想了解源碼,在這里也貼上
char *strtok(char *str,const char *delim) {static char *next_start = NULL; //保存到靜態存儲區,函數返回后不會被銷毀if(str == NULL && (str = next_start) == NULL){return NULL;}char *s = str;const char *t = NULL;while(*s){t = delim;while(*t){if(*t == *s){next_start = s + 1;if(s == str) //第一個字符就是分隔符{str = next_start;break;}else{*s = '\0';return str;}}else{t++;}}s++;}return NULL; }關于這個函數在項目編程中需要經常使用,所以就搜集資料整理成自己的學習筆記了,如有不對,留言改正!
總結
以上是生活随笔為你收集整理的字符分割函数strtok的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32中断源有哪些_143条 超详细
- 下一篇: 一文掌握abaqus各类选取功能,以基于