1、問題引入
自己在寫一個linux下的模擬執行指令的時候,遇到了輸入"cat a.c”,要將該字符串分解成cat和a.c兩個單獨的字符串,雖然知道有strtok的存在,但是想自己嘗試寫一下,於是就自己寫了一個,不過總是遇到這樣或那樣的問題,雖然最后調通了,不過確浪費了不少時間;后來作業交上去以后又仔細閱讀了strtok函數,發現原來linux下已經改成strsep,所有在這里就寫一下自己所走的過程。
2、自己寫的字符串分割函數:用於分割指令,比如cat a.c最后會被分割成cat和a.c兩個字符串、mv a.c b.c最后會被分割成mv和a.c和b.c三個字符串。
具體實現如下:

1 #include <stdio.h> 2 #include<string.h> 3 #define MAX_LEN 128 4 void main() 5 { 6 int i,length,ct=0,start = -1; 7 char inputBuffer[MAX_LEN],*args[MAX_LEN]; 8 strcpy(inputBuffer,"mv a.c b.c"); 9 length=strlen(inputBuffer); 10 for (i = 0; i <= length; i++) { 11 switch (inputBuffer[i]){ 12 case ' ': 13 case '\t' : /* argument separators */ 14 if(start != -1){ 15 args[ct] = &inputBuffer[start]; /* set up pointer */ 16 ct++; 17 } 18 inputBuffer[i] = '\0'; /* add a null char; make a C string */ 19 start = -1; 20 break; 21 case '\0': /* should be the final char examined */ 22 if (start != -1){ 23 args[ct] = &inputBuffer[start]; 24 ct++; 25 } 26 inputBuffer[i] = '\0'; 27 args[ct] = NULL; /* no more arguments to this command */ 28 break; 29 default : /* some other character */ 30 if (start == -1) 31 start = i; 32 } 33 } 34 printf("分解之后的字符串為:\n"); 35 for(i=0;i<ct;i++) 36 printf("%s \n",args[i]); 37 }
3、作業提交后又查詢了strtok,發現使用strtok函數會方便很多
具體示例如下:

#include <stdio.h> #include<string.h> int main() { char str[] = "mv a.c b.c"; char *p; p = strtok(str, " "); while(p) { printf("%s\n", p); p = strtok(NULL, " "); } return 0; }
4、在linux2.6.29以后的版本中,strtok被strsep代替了。
具體示例如下:

1 #include <stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char str[] = "mv a.c b.c"; 6 char *p; 7 char *buff; 8 buff=str; 9 p = strsep(&buff, " "); 10 while(p) 11 { 12 printf("%s\n", p); 13 p = strsep(&buff, " "); 14 } 15 return 0; 16 }
而且在我自己的電腦的linux中的codeblog下,運行4中代碼需要0.029s,而運行3中的代碼需要0.044s,說明strsep速度確實比strtok快一些,,。