使用C语言实现字符串分割

使用C语言实现字符串分割之前分享了一篇使用C++(std::string作为容器)进行字符串分割的博文:https://blog.csdn.net/r5014/article/details/82802664 现在又想用C语言做一个字符串分割的函数,大概功能是这样:需要分割的字符串“  thisisacharactor raw.  ”使用”分割分割之后会返回一个char**…

大家好,又见面了,我是你们的朋友全栈君。

之前分享了一篇使用C++(std::string 作为容器)进行字符串分割的博文:

https://blog.csdn.net/r5014/article/details/82802664

 

现在又想用C语言做一个字符串分割的函数,大概功能是这样:

需要分割的字符串“    this is a charactor  raw.    ” 使用 ‘ ‘分割

分割之后会返回一个char** strv 表示分割出子串str的vector,返回一个int strc表示分割出子串的数量,在使用完毕之后自行释放strv

strv可能是NULL 比如”      “使用‘ ’分割之后就是NULL。

以下介绍分割函数splitstr_c()

//* 切割字符串,strv返回字符串数组,strc返回分割之后的字符串数量
void splitstr_c(char* str, char c, char*** strv, int* strc)
{
    int    i = 0;
    int    j = 0;
    int    n = 0;
    int    offset_strv = 0;
    int    offset_font = 0;
    int    offset_back = 0;
    int    str_size = strlen(str);
    char** tstrv = NULL;


    for(i = 0; i < str_size; i++)
    {
		if(i > 0)
		{
			if((str[i] != c) && (str[i - 1] == c))
			{
				n++;
			}
		}
		else
		{
			if(str[0] != c)
			{
				n++;
			}
		}
    }
	if(n == 0)
	{
		 for(i = 0; i < str_size; i++)
		 {
			if(str[i] != c)
			{
				n++;
				break;
			}
		 }
	}
		


    * strc = n;
    tstrv = (char**)malloc(sizeof(char*) * n);
    memset(tstrv, 0, sizeof(char*)*n);

    for(i = 0; i < str_size; i++)
    {
        if(str[i] == c)
        {
            offset_back = i;
            if(offset_back != offset_font)
            {
                n = offset_back - offset_font;
                char* sub_str = (char*)malloc(sizeof(char) * (n + 1)); //* n + 1是为了容纳'\0'
                memset(sub_str, 0, sizeof(char) * (n + 1));
                memcpy(sub_str, str + offset_font, n);
                tstrv[offset_strv] = sub_str;
                offset_strv++;
            }

            offset_font = offset_back + 1;
        }
    }

    if(offset_back < str_size)
    {
        offset_back = str_size;

        if(offset_back != offset_font)
        {
            n = offset_back - offset_font;
            char* sub_str = (char*)malloc(sizeof(char) * (n + 1));
            memset(sub_str, 0, sizeof(char) * (n + 1));
            memcpy(sub_str, str + offset_font, n);
            tstrv[offset_strv] = sub_str;
            offset_strv++;
        }

        offset_font = offset_back + 1;
    }

    * strv = tstrv;
}

顺带给出两个小工具函数:

//* print strv
void print_strv(char** strv, int strc)
{
	if(strc > 0)
	{
		for(int i = 0; i < strc; i++)
		{
			printf("%s\n",strv[i]);
		}
	}
}

//* strv使用完之后根据strc来进行释放。
void free_strv(char** strv, int strc)
{
	if(strc > 0)
	{

		for(int i = 0; i < strc; i++)
		{

			//printf("%s\n",strv[i]);
			free(strv[i]);
		}

		free(strv);
	}
}

 

让我们来试一下:

char  *text = "   this  is a charactor text.    ";
//char  *text = "000this00is0a0charactor0text.00";
//char  *text = "this is a charactor text.";
//char *text = "a  a a    a     s  ";

char** strv = NULL;
int    strc = 0;

splitstr_c(text, ' ', &strv, &strc);

printf("splitstr_c: %d\n", strc);
print_strv(strv, strc);
free_strv(strv, strc);

 

结果:

使用C语言实现字符串分割

 

自此这个功能就实现了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143773.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 对spring的xml文件头部分配置的理解

    对spring的xml文件头部分配置的理解

    2021年7月19日
    56
  • 比SQL还好用,又一门国产数据库语言诞生了「建议收藏」

    比SQL还好用,又一门国产数据库语言诞生了「建议收藏」数据库语言,你会哪几种?写得简单又跑的快,它来了……

    2022年10月6日
    0
  • python解释器找不到_python解释器路径

    python解释器找不到_python解释器路径Pycharm“nothingtoshow”ininterpreters(解决Pycharm无法找到编译器的问题)问题描述解决方案问题原因解决过程问题描述暑假放假两周,两周没写代码,打开PyCharm发现编译器找不到了(PythonInterpreterNothingtoshow),程序自然也无法运行,如图:解决方案解决方案来自StackOverflow,原出处:link.(https://stackoverflow.com/questions/67297284/pycharm

    2022年8月26日
    3
  • 华为悦盒ec6108v9a怎么刷机_华为悦盒官方固件

    华为悦盒ec6108v9a怎么刷机_华为悦盒官方固件华为悦盒EC6108V9A一、产品型号二、工具准备与资料下载1.[当贝网站教程及工具下载](https://www.znds.com/jc/article/7020-1.html)(此网站的工具可以用,但当贝的教程极其混乱,仅供动手者参考)2.固件路径三、刷机教程1.进入盒子的Androidsystemrecovery<3e>2.清除数据3.选择Applyupdatefromexternalstorage四、盒子默认密码五、常用应用一、产品型号名称型号华为悦

    2022年10月27日
    0
  • macbookpro双系统分区_macbook双系统分区调整

    macbookpro双系统分区_macbook双系统分区调整一些前序知识:1、Mac系统不是Intel的i386架构,没有Bios,但是有EFI,通过EFI管理系统的引导。2、Mac系统的分区表采用GUID,不是MBR。因此如果硬盘完全交给windows控制,会导致Mac系统无法启动。3、任何对MBR的强行操作,会导致已经装好的双系统引导失效。4、Mac的EFI分区会用GPT锁定,不要尝试去操作这个分区。我们…

    2022年10月5日
    0
  • debug的基本使用_debug功能

    debug的基本使用_debug功能**debug使用方法(概念篇)**1.进入debug模式(基础知识列表)1、设置断点2、启动servers端的debug模式3、运行程序,在后台遇到断点时,进入debug调试状态作用域功能快捷键全局单步返回F7全局单步跳过F6全局单步跳入F5全局单步跳入选择Ctrl+F5全局调试上次启动F11全局继续F8全局使用过滤器单步执行Shift+F5全局添加/去除断点Ctrl+Shift+B全局显示Ctrl+D全局运行上次启动Ctrl+

    2022年10月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号