c语言中字符串分割函数及实现方法

前端技术 2023/09/03 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三个字符串。

具体实现如下:

#include <stdio.h>
#include<string.h>
#define MAX_LEN 128
void main()
{
  int i,length,ct=0,start = -1;
  char inputBuffer[MAX_LEN],*args[MAX_LEN];
  strcpy(inputBuffer,\"mv a.c b.c\");
  length=strlen(inputBuffer);
   for (i = 0; i <= length; i++) {
    switch (inputBuffer[i]){
    case \' \':
    case \'\\t\' :        /* argument separators */
      if(start != -1){
        args[ct] = &inputBuffer[start];  /* set up pointer */
        ct++;
      }
      inputBuffer[i] = \'\\0\'; /* add a null char; make a C string */
      start = -1;
      break;
    case \'\\0\':         /* should be the final char examined */
      if (start != -1){
        args[ct] = &inputBuffer[start];
        ct++;
      }
      inputBuffer[i] = \'\\0\';
      args[ct] = NULL; /* no more arguments to this command */
      break;
    default :       /* some other character */
      if (start == -1)
        start = i;
    }
   }
  printf(\"分解之后的字符串为:\\n\");
  for(i=0;i<ct;i++)
    printf(\"%s \\n\",args[i]);
}

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

具体示例如下:

#include <stdio.h>
#include<string.h>
int main()
{
  char str[] = \"mv a.c b.c\";
  char *p;
  char *buff;
  buff=str;
  p = strsep(&buff, \" \");
  while(p)
  {
    printf(\"%s\\n\", p);
    p = strsep(&buff, \" \");
  }
  return 0;
}

而且在我自己的电脑的linux中的codeblog下,运行4中代码需要0.029s,而运行3中的代码需要0.044s,说明strsep速度确实比strtok快一些。

以上这篇c语言中字符串分割函数及实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。

本文地址:https://www.stayed.cn/item/6629

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。