C语言 字符串分割

C语言 字符串分割C语言字符串分割一、简述记–字符串分割,strtok()函数的使用例子、自己实现split()函数。二、例子代码#include<stdio.h>#include<string.h>/**函数:split*描述:按指定分隔符分割字符串*参数:* str:要分割的字符串* strLen:要分割…

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

                                                         C语言 字符串分割

 

一、简述
        记–字符串分割,strtok()函数的使用例子、自己简单实现split()函数。

二、例子代码

#include <stdio.h>
#include <string.h>
 
/*
 * 函数:split
 * 描述:按指定分隔符分割字符串
 * 参数:
 *		str:要分割的字符串
 *		strLen:要分割的字符串的长度
 * 		splitChar:分隔符
 * 		index:获取第几部分, 1<=index
 *		result:结果字符串, result = str[index-1];
 * 		maxLen:指定结果的最大长度
 * 返回值:
 *		>=0:成功, 结果长度
 * 		其它:失败
 * 例子:
 *		split("11;22;33", 8, ';', 2, result. 16);
 *		结果result是:22.
 */
int split(const char* str, int strLen, const char* splitChar, int index, char* result, int maxLen)
{
	int i = 0;
    int ret = 0;	
	int findLen = 0;
	int findFlag = 0;	
	int startIndex = 0;
	int splitCharLen = 0;
	
	//合法性判断
	if(NULL == str || NULL == result || NULL == splitChar || index<=0)
	{
		return -1;
	}		
	splitCharLen = strlen(splitChar);
	findLen = strLen-splitCharLen;
	if(findLen<0)
	{
		return -2;
	}	
	
	//查找结果的左右分隔符位置
	for(; i<=findLen && str[i] != '\0'; i++)
	{
		if(strncmp(&str[i], splitChar, splitCharLen) == 0)
		{
			if(0 == findFlag)//find the left
			{
				startIndex++;
				if(1 == index)//第一个直接返回
				{
					strncpy(result, &str[0], i);
					ret = i;
					break;
				}
				else if(startIndex+1 == index)
				{
					startIndex = i;
					findFlag = 1;
				}
			}
			else//find the right
			{
				findFlag = 2;
				break;
			}
		}
	}	
	
	//截取结果
	if(0 != findFlag && startIndex<strLen-1)
	{
		startIndex += splitCharLen;
		ret = i-startIndex;//结果的字符个数
		if(ret>maxLen || ret>strLen)
		{
			ret = 0;
		}
		else if(ret>0)
		{
			strncpy(result, &str[startIndex], ret);
			ret = strlen(result);
		}
	}
	return ret;
}
 
int main(void)
{	
	{
		const char* splitChar = ";";
		printf("\n==========strtok1==========\n");
		char str1[128] = "Keep;learning;and;study;hard";
		printf("str1:\"%s\", splitChar:\"%s\"\n", str1, splitChar);
		
		char* ptr = strtok(str1, splitChar);
		for(; ptr != NULL; )
		{
			printf("%s\n", ptr);
			ptr = strtok(NULL, splitChar);
		}
		printf("strtok after, str1:%s\n", str1);
		
		printf("\n==========split1==========\n");
		char str2[128] = "Keep;learning;and;study;hard";
		printf("str2:\"%s\", splitChar:\"%s\"\n", str2, splitChar);
		int i;
		int ret = 1;
		char result[128];
		int strLen = strlen(str2);
		int resultLen = sizeof(result);
		for(i=1; ret>0; i++)
		{
			memset(result, 0, sizeof(result));
			ret = split(str2, strLen, splitChar, i, result, resultLen);
			if(ret>0)
			{
				printf("%s\n", result);
			}
		}
		printf("split after, str2:%s\n", str2);
	}
	
	{
		const char* splitChar = "##";
		printf("\n==========strtok2==========\n");
		char str1[128] = "Keep##learning##and##study##hard";
		printf("str1:\"%s\", splitChar:\"%s\"\n", str1, splitChar);
		
		char* ptr = strtok(str1, splitChar);
		for(; ptr != NULL; )
		{
			printf("%s\n", ptr);
			ptr = strtok(NULL, splitChar);
		}
		printf("strtok after, str1:%s\n", str1);
		
		printf("\n==========split2==========\n");
		char str2[128] = "Keep##learning##and##study##hard";
		printf("str2:\"%s\", splitChar:\"%s\"\n", str2, splitChar);
		int i;
		int ret = 1;
		char result[128];
		int strLen = strlen(str2);
		int resultLen = sizeof(result);
		for(i=1; ret>0; i++)
		{
			memset(result, 0, sizeof(result));
			ret = split(str2, strLen, splitChar, i, result, resultLen);
			if(ret>0)
			{
				printf("%s\n", result);
			}
		}
		printf("split after, str2:%s\n", str2);
	}
	return 0;
}

三、测试结果

C语言 字符串分割

 

C语言 字符串分割

四、总结
    strtok()函数介绍

 

strtok()函数
功能 分割字符串
头文件 #include <string.h>
原型 char *strtok(char *str, const char *delim);
参数

str:要分割的字符串

delim:分隔符

返回值 成功:非空指针,分割后的结果字符串
失败:NULL,分割后没有得到有效的字符串
备注

第一次调用strtok()时,要解析的字符串应在str中指定。 在每个随后的应解析相同字符串的调用中,str必须置空。

即第一次是strtok(str, spplitChar);

后面调用strtok(NULL, spplitChar);

注意:调用strtok之后会修改原来的str

 

 

详情请查询man手册,man strtok

C语言 字符串分割

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

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

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


相关推荐

  • 计算机专业男人喜欢什么样的女人,说实在的,其实男人真正喜欢的女人,就三个特征…

    计算机专业男人喜欢什么样的女人,说实在的,其实男人真正喜欢的女人,就三个特征…男人和女人有什么不同?大概是后者的世界里只有爱情,前者的世界里除了爱情,还有对金钱与权力的渴望。人比人气死人。有些女人从来都不缺追求者,有些女人从来都没有追求者,很多时候并不明白,她到底比她差在哪里?这还不算扎心的,有些女人绞尽脑汁,都没能守住自己的爱情,而有些女人看着都没怎么费力,却保卫了自己的爱情。也许我们都要深思,那些一直“幸运”的女人到底有什么秘诀。对于感情,女人一般会有的疑问,无非两个。…

    2022年7月25日
    45
  • java培训机构_南阳清大教育培训机构

    java培训机构_南阳清大教育培训机构正文谈到MYSQL的事物,相信大家对这几个概念都不会陌生:四大特性:ACID并发问题脏读不可重复读幻读隔离级别ReadUncommitted(读未提交)ReadCommitted(读提交)RepeatableRead(可重读)Serializable(可串行化)下面的思维导图可能更表达得清晰????MySQL的默认事物隔离级别是RR(RepeatableRead),可重复读级别是能够解决脏读、不可重复读的这两个事物并发问题的,但是幻读的问题仍

    2022年9月26日
    3
  • 玩转xss

    玩转xss0x00前言很多人现在都没懂xss为什么这么鸡肋的漏洞能排到owasp前十名,xss做多也就拿来做个弹窗和打cookie,然后进入后台,感觉没啥意义,还不如弱口令来得实在。那么我们就先

    2021年12月11日
    106
  • Landsat8的不同波段组合说明

    Landsat8的不同波段组合说明原文地址:Landsat8的不同波段组合说明作者:ENVI-IDL中国   LandsatTM(ETM+)7个波段可以组合很多RGB方案用于不同地物的解译,Landsat8的OLI陆地成像仪包括9个波段,可以组合更多的RGB方案。   OLI包括了ETM+传感器所有的波段,为了避免大气吸收特征,OLI对波段进行了重新调整,比较大的调整是OLIBand5(0.845–0.885μm),

    2022年7月23日
    19
  • 无人机——舵机篇(七)[通俗易懂]

    无人机——舵机篇(七)[通俗易懂]文章目录1.舵机的基本知识2.舵机的组成3.舵机的工作原理1.舵机的基本知识舵机就是一种有输出轴的小传动装置。这个输出轴能够通过向舵机输入一个编码信号而定位到我们指定的角度位置。只要这个编码信号存在于信号输入线上,舵机就将保持输出轴的当前角度位置不变。一旦编码信号改变,输出轴的角度位置也将跟着改变。实际中,舵机被用于控制无人机升降尾翼、方向尾翼等的位置。

    2022年6月11日
    287
  • Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考。由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分钟左右)Redis主从复制简单介绍为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运…

    2022年2月27日
    57

发表回复

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

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