頭文件:#include <string.h>
定義函數:char * strtok(char *s, const char *delim);
函數說明:strtok()用來將字符串分割成一個個片段。參數s 指向欲分割的字符串,參數delim 則為分割字符串,當
strtok()在參數s 的字符串中發現到參數delim 的分割字符時則會將該字符改為\0 字符。在第一次調用時,strtok()必需
給予參數s 字符串,往后的調用則將參數s 設置成NULL。每次調用成功則返回下一個分割后的字符串指針。
返回值:返回下一個分割后的字符串指針,如果已無從分割則返回NULL。下面看一個例子:
int main()
{
? ? char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";? ? char *delim = "-: ";
? ? char *p;
? ? printf("%s ", strtok(s, delim));
? ? while((p = strtok(NULL, delim)))
? ? ? ? printf("%s ", p);
? ? ? ? printf("\n");
? ? return0;
}
執行結果為:
ab cd ef;gh i jkl;mnop;qrs tu vwx y;z 。
自己實現strtok函數:
#include<stdio.h>
//該程序的關鍵點在于定義了一個靜態的字符指針,該指針用來記錄分割后的字符串的首地址//傳入NULL,則表示繼續處理靜態指針指向的余下字符串
char *strtok(char *str, const char *delim)
{
? ? ? ? static char *src=NULL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //記下上一次非分隔字符串字符的位置,詳見圖示
? ? ? ? const char *indelim=delim; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//對delim做一個備份
? ? ? ? int flag=1,index=0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? //每一次調用strtok,flag標記都會使得程序只記錄下第一個非分隔符的位置,以后出現非分隔符不再處理
? ? ? ? char *temp=NULL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //程序的返回值
?
? ? ? ? if(str==NULL)
? ? ? ? {
? ? ? ? ? str=src; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //若str為NULL則表示該程序繼續處理上一次余下的字符串
? ? ? ? }
? ? ? ? for(;*str;str++)
? ? ? ? {
? ? ? ? ? ?delim=indelim;
? ? ? ? ? for(;*delim;delim++)
? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? if(*str==*delim)
? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? *str='\0'; ? ? ? ? ? ? ? ? ? ?//若找到delim中感興趣的字符,將該字符置為NULL
? ? ? ? ? ? ? ? ? ? ? ? ? index=1; ? ? ? ? ? ? ? ? ? ? ? ? //用來標記已出現感興趣字符
? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
? ? ? ? ? if(*str != '\0' && flag==1)
? ? ? ? ? {
? ? ? ? ? ? ? ? ? temp=str; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//只記錄下當前第一個非感興趣字符的位置
? ? ? ? ? ? ? ? ? flag=0; ?
? ? ? ? ? ?}
? ? ? ? ? if(*str != '\0' && flag==0 && index==1)
? ? ? ? ? {
? ? ? ? ? ? ? ? ?src=str; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //第二次出現非感興趣字符的位置(之前一定出現過感興趣字符)
? ? ? ? ? ? ? ? ?return temp;
? }
? ? ? ? }
? ? ? ? src=str; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? //執行該句表明一直未出現過感興趣字符,或者說在出現了感興趣的字符后,就沒再出現過非感興趣字符
? ? ? ? return temp;
}
?
int main()
{
? ? char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
? ? char *delim = "-: ";
? ? char *p;
? ? printf("%s ", strtok(s, delim));
? ? while((p = strtok(NULL, delim) ))
{
printf("%s ", p);
? ? ? ? printf("\n");
} ? ? ??
? ?return0;
}