程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言字符串分割——strtok

C語言字符串分割——strtok

編輯:關於C

之前遇到字符串分割的需求時,都是自己去實現,最近發現其實c標准庫已經提供了這個功能。對標准庫還是不熟悉啊,導致重復造車輪了,有必要把標准庫看一下。。。
        先看一下之前自己實現的字符串分割函數:
[cpp] 
void strsplit(const char *str, char *delim, void (*visitor)(const char *, int, int)){ 
        int i, k_s, k_e, s_len, d_len; 
        s_len = strlen(str); 
        d_len = strlen(delim); 
 
        assert(str!=NULL && delim!=NULL && visitor!=NULL); 
                                           
        k_s = k_e = 0;                     
        while(k_e < s_len){ 
                if( (k_e + d_len <= s_len) && strncmp(str+k_e, delim, d_len) == 0 ){ 
                        if(k_e > k_s) 
                                visitor(str, k_s, k_e); 
                        k_s = k_e = k_e + d_len; 
                }else{ 
                        k_e++; 
                } 
        } 
 
        if(k_e > k_s){ 
                visitor(str, k_s, k_e); 
        } 

        str:要分割的字符串的字符串。
        delim:分隔符,可以是多個字符的字符串。
        visitor:函數指針,在識別出子串時調用。
        對於字符串"abc##123###a##",分隔符是"##",會將其分割為"abc","123",“#a”。也就是說,要分割的字符串中的子串必須與分割字符串相等,才算做分隔符,而不是只要包含在分割字符串就算做分隔符,這個與標准庫的有點不同。但是對於分隔符只有一個字符的情況與標准庫的執行結果是相同的,比如:如果上面的字符串的分割符是"#",那麼最後結果就是"abc",“123”,"a"。
        出現這個不一致,是因為如果某個子串與分割字符串相等,那麼直接跳過strlen(分割字符串)個字符,然後繼續檢查。如果這裡改成跳到下一個字符然後繼續檢查,那麼就會和標准庫的函數得到一樣的結果。就是把第13行替換為:
[cpp]
k_e++; 
k_s = k_e + (d_len - 1); 
        上面介紹了分割字符串的實現,下面看一下標准庫提供的函數strtok。
[cpp] 
char *strtok(char *str, const char *delim); 
        str:要分割的字符串。
        delim:分割字符串,包含在分割字符串中的字符都會被當做是分割字符而丟棄掉。
        看個例子:
[cpp] 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
 
int 
main(int argc, char **argv){ 
        char *s, *d, *t;  
 
        if(argc < 3){  
                printf("%s\n", "wrong args. usage: str delim"); 
                exit(1); 
        }    
 
        s = argv[1]; 
        d = argv[2]; 
 
        t = strtok(s, d); 
        while(t != NULL){ 
                printf("%s\n", t); 
                t = strtok(NULL, d); 
        }           
}                   
        第一次調用strtok需要傳入要分割的字符串str進行初始化,隨後對同一個字符串繼續分割傳入NULL即可。這個地方需要注意,如果不傳入NULL,那麼就會出現死循環,一直返回str第一個被分割出的子串。
        分割字符串delim每次都可以傳入不同的字符串,也就是說可以根據不同的分隔符分割字符串,不過這樣的需求還是比較不常用的。
        通過這個函數以後完成配置文件的解析就比較方便了,不用再被各種各樣的bug打擾。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved