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

 更新时间:2016年05月30日 15:16:43   投稿:jingxian  
下面小编就为大家带来一篇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语言中字符串分割函数及实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现将s16le的音频流转换为float类型

    C++实现将s16le的音频流转换为float类型

    这篇文章主要为大家详细介绍了如何利用C++实现将s16le的音频流转换为float类型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • Qt地图自适应拉伸的实现示例

    Qt地图自适应拉伸的实现示例

    最近需要写一个程序,要是让qt到程序自适应,本文主要介绍了Qt地图自适应拉伸的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 深入了解一下C语言中的柔性数组

    深入了解一下C语言中的柔性数组

    柔性数组是在C99中定义的,即结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组。这篇文章将通过简单的示例为大家介绍一下柔性数组的使用,感兴趣的可以了解一下
    2023-02-02
  • C和C++ const的声明差异

    C和C++ const的声明差异

    本文给大家简单汇总了下C语言的const与C++的const的声明差异,非常的简单,也很实用,有需要的小伙伴可以参考下
    2016-03-03
  • QTableWidget设置只让某一列可编辑的实现

    QTableWidget设置只让某一列可编辑的实现

    本文介绍了如何将QTableWidget的某一列设置为可编辑,以便用户可以输入自定义数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • C++顺序表的实例代码

    C++顺序表的实例代码

    这篇文章主要为大家详细介绍了C++实现顺序表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • C语言顺序表的实现代码

    C语言顺序表的实现代码

    这篇文章主要为大家详细介绍了C语言实现顺序表的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • C/C++ Qt TabWidget 实现多窗体创建详解

    C/C++ Qt TabWidget 实现多窗体创建详解

    TabWidget组件配合自定义Dialog组件,可实现一个复杂的多窗体分页结构。这篇文章就主要介绍了如何通过TabWidget实现多窗体的创建,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C语言近万字为你讲透栈和队列

    C语言近万字为你讲透栈和队列

    对于线性表,我们可能要执行下列操作:访问表的第k个结点、在k这个结点之前或者之后插入一个新结点,抑或是删除第k个结点等等操作,其中我们会遇到值对第一个或者最后一个结点插入、删除、和访问值的线性表,我们给它们以特殊的名称:栈、队列、双端队列
    2022-05-05
  • C语言实现数独程序的示例代码

    C语言实现数独程序的示例代码

    数独是源自瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。本文将利用C语言实现数独程序,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03

最新评论