使用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是为了容纳'
//* 切割字符串,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;
}
' 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语言实现字符串分割

 

自此这个功能就实现了

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java链表数据结构是什么_java 链表数据结构

    java链表数据结构是什么_java 链表数据结构首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了。下面直接进入正题:先要定义一个结点类,如下:Java代码publicclassNode{Nodenext;//下一个结点的引用Objectobj;//结点元素publicNode(Objectobj){this.obj=obj;…

  • 算术运算符——整数运算

    算术运算符——整数运算

  • 8年IT工作经验为何只能拿月薪1700?

    8年IT工作经验为何只能拿月薪1700?

  • FindWindowEX的实例

    FindWindowEX的实例 FindWindowEX的实例  [日期:2004-12-24]  [来自:本站原创]函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。   函数原型:HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCT

  • 小米6X 解BL锁教程 申请BootLoader解锁教程[通俗易懂]

    小米6X 解BL锁教程 申请BootLoader解锁教程[通俗易懂]小米6X线刷兼救砖_解账户锁_纯净刷机包_教程一、准备工作1、注册小米账号:点击注册(已有小米账号请忽视)2、在手机中登陆【小米账号】3、下载并解压【小米解锁工具】或点击这里下载安装二、开始解锁1打开【小米解锁官网】:http://www.miui.com/unlock/,点击【立即解锁】,输入【小米账号】,点击【立即登录】,填写好上诉信息后,点击【立即申请】,输入【短…

  • (2021 最新版)IntelliJ IDEA 下载安装及配置教程

    (2021 最新版)IntelliJ IDEA 下载安装及配置教程前言因为自己电脑最近实在是太卡了,也一直提示更新,索性就直接重装了个系统。因为需要重装下IDEA,而现在新版本的IDEA和之前的版本还是有很大变化的,所以在这里写一篇博客做个记录,方便自己后续配置,也顺便分享给大家。准备工作既然要安装IDEA,那么首先需要前往JetBrains的官网下载最新版的IDEA,下载地址如下:https://www.jetbrains.com/idea/download/这里最新的版本是2021.1.2,而因为我有旗舰版的账号,所以这里就以旗舰版安装

发表回复

您的电子邮箱地址不会被公开。

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