首页 > 其他分享 >C语言 字符串分割

C语言 字符串分割

时间:2023-08-30 20:11:21浏览次数:38  
标签:分割 strtok int splitChar C语言 char result printf 字符串

一、简述         记--字符串分割,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; } 三、测试结果 四、总结     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    

标签:分割,strtok,int,splitChar,C语言,char,result,printf,字符串
From: https://www.cnblogs.com/kn-zheng/p/17668166.html

相关文章

  • python字符串内容分割
    分隔主要涉及到split,rsplit,splitlines,partition和rpartition五个方法。split以指定字符串为分隔符切片,如果maxsplit有指定值,则仅分隔maxsplit+1个子字符串。返回的结果是一个列表。没有指定分隔符,默认使用空格,换行等空白字符进行分隔char="hello\nworld"result=c......
  • Gson读取json字符串中结果需要转泛型的情况解决方案
    原始代码:Gsongson=newGson();ArrayList<Fld>fixed=gson.fromJson(newFileReader(headFilePath),ArrayList.class);for(Fldfld:fixed){intfld_len=fld.getFld_len();}错误显示:com.g......
  • 【lc】459. 重复的子字符串
    链接:https://leetcode.cn/problems/repeated-substring-pattern/description/思路:这题其实挺有意思的,我一开始寻思按照字符读到一个dict里统计各个字符的个数,讲道理每个字符的个数是相同的才对。(我承认我傻了,忽略了aab这种情况)然后我就开始想,如果能行,那原串肯定是子串的n倍。......
  • C语言指针进阶
    目录字符指针指针数组数组指针数组指针的定义&数组名VS数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参一级指针二级指针数组指针函数指针函数指针数组指向函数指针数组的指针回调函数编码的三种境界:1.看代码就是代码2.看代码就是内......
  • 手撕代码之字符串
    文章目录一、反转字符串中的每一个单词(leetcode151、557)二、多个字符串的最长公共前缀(leetcode14)三、字符串转整数(leetcode8)四、N位数字串删除K个数字,使剩下的数字串最小(leetcode402)五、回文子串的个数(Leetcode647)六、最长无重复字符的子串(leetcode3)七、最长回文子串(leetcod......
  • 一次html中展示xml字符串不显示问题记录
    现象在html中展示xml字符串时不显示原因展示xml字符串时代码为document.getElementById("demoPre").innerHTML=xml字符串,此时xml并不会作为文本显示,而是将xml节点嵌入html中,而浏览器又不能解析xml节点,最后就不显示解决办法修改代码为document.getElementById("demoPre")......
  • Oracle 字符串相似度查询
    Oracle函数: SYS.UTL_MATCH.EDIT_DISTANCE_SIMILARITY(str,patternStr)--Oracle查询字符串相似度函数SELECTDISTINCTe.EQP_GROUP,SYS.UTL_MATCH.EDIT_DISTANCE_SIMILARITY(e.EQP_GROUP,'LARF')xsdFROMIMP_AREA_EQPGROUP_MAPPINGeORDERBYXSDDESC查询结果: ......
  • r'\1'表示替换字符串中的第一个捕获组 将匹配到的字符串被替换为第一个捕获组的内容
    请解释pd.Series.str.replace(pat=r'(?i)(.*)-h.*',#(.*)表示一个捕获组repl=r'\1',#将匹配到的字符串被替换为捕获组的内容regex=True)中r'\1'的作用在pd.Series.str.replace()函数中,r'\1'表示替换字符串中的第一个捕获组......
  • sqlite3C语言api
    安装sqliteapt-getinstallsqlite3进入和退出sqlite3//进入sqlite3,内容保存至内存,退出后内容会丢失sqlite3<表名>//保存到文件中,例sqlite3student.exit//退出sqlite3,‘.'不能少创建表#以学生表为例createtablestudent(idinteger,nametext,ageinteger......
  • Bash 字符串处理
    一、截取语法格式说明${string:start:length}从string字符串的左边第start个字符开始,向右截取length个字符。${string:start}从string字符串的左边第start个字符开始截取,直到最后。${string:0-start:length}从string字符串的右边第start个字......