c語言中字符串分割函數及實現


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三個字符串。

  具體實現如下:

  

View Code
 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函數會方便很多
  具體示例如下:

  

View Code
#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代替了。

  具體示例如下:

View Code
 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快一些,,。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM