C语言中字符切割函数split的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中字符切割函数split的实现相关的知识,希望对你有一定的参考价值。
在项目开发中,遇到要处理字符串,但是字符串的处理没有C#、Java这样的高级语言来的方便,每次使用都得需要自己定义。先在需要用到字符切割函数Split了,需要自己定义一下。
下面的是我自己定义的,但是不太智能化,希望各位高手帮帮忙,不然我可真的就死大发了。先贴出我的拙劣代码:
#include <stdio.h>
#include <string.h>
int strsplinum(char *str, const char*del) //判断总共有多少个分隔符,目的是在main函数中构造相应的arr指针数组
char *first = NULL;
char *second = NULL;
int num = 0;
first = strstr(str,del);
while(first != NULL)
second = first+1;
num++;
first = strstr(second,del);
return num;
void split( char **arr, char *str, const char *del)//字符分割函数的简单定义和实现
char *s =NULL;
s=strtok(str,del);
while(s != NULL)
*arr++ = s;
s = strtok(NULL,del);
int main()
char str[] = "aaaa|bbbb|cccc";
const char *del = "|"; //分隔符
int numTest = 1;
int i=0;
char *arr[4]; //利用指针数组对应分割好的字符串数组(即二维数组中的行数组)
numTest = strsplinum(str,del);
printf("the numbers of arry is : %d \n",numTest+1);
split(arr,str,del);
while(i<=numTest)
printf("%s\n",*(arr+i++)); //打印分割好的字符串
return 0;
最开始定义函数strsplinum的目的是想动态分配刚刚好的指针数组arr来对应分割好的字符串数组,
这样就完全实现了C#中split的功能,但是,很遗憾,没有实现,因为C语言中,必须是先定义变量,
后调用函数,也就是说,numTest通过strsplinum来获取值后,不能再写char *arr[numTest];
这样的限制就无法实现动态智能分配相应的字符串数组了。
求各位高手帮帮忙,小弟感谢了。
#include <string.h>
// 将str字符以spl分割,存于dst中,并返回子字符串数量
int split(char dst[][80], char* str, const char* spl)
int n = 0;
char *result = NULL;
result = strtok(str, spl);
while( result != NULL )
strcpy(dst[n++], result);
result = strtok(NULL, spl);
return n;
int main()
char str[] = "what is you name?";
char dst[10][80];
int cnt = split(dst, str, " ");
for (int i = 0; i < cnt; i++)
puts(dst[i]);
return 0;
参考技术A c语言中 有切割字符串的函数啊!
strtok函数(const char *str, const char *ch)
第一个是字符串,第二个是以那个字符做切割。
例子:
#include <stdio.h>
#include <string.h>
int main(void)
char s[] = "123-sldkf-123ls-343434-dfjdlkfj-dflcmvn";
char *delim = "-";
char *p;
printf("%s ", strtok(s, delim));
while((p = strtok(NULL, delim))
printf("%s ", p);
printf("\n");
return 0;
char s[] = "dlkjf-sdlkfjsdf\lsdkljfl'sldkjf\sdkfjsdlf\lskdjfls";
如果想用-和\两个符号切割的话
char *delim = "-\";
这样就可以了本回答被提问者和网友采纳 参考技术B
找了很久都没找到个靠谱的split函数。
我还是自己写一个分享在这里吧。英语不好请见谅:
/**split the string by delimiter.
need to use "free" method to release the each of string in array.
@param targetString splited String
@param delimiter the delimiter to split the string
@param length the array`s length of result
@return array of splited string(need release manually)
*/
char** split(const char * const targetString, const char * const delimiter,int * const length)
*length=0;
char ** resultString=NULL;
char inputString[strlen(targetString)];
strcpy(inputString,targetString);
char inputDelimiter[strlen(delimiter)];
strcpy(inputDelimiter,delimiter);
char * splitedString = strtok(inputString, inputDelimiter);
while (splitedString)
(*length)++;
char * resultChar = NULL;
resultChar=malloc(strlen(splitedString));
strcpy(resultChar,splitedString);
resultString=realloc(resultString,(*length) * sizeof(char *));
resultString[(*length)-1] =resultChar;
splitedString=strtok(NULL, delimiter);
return resultString;
int main(int argc, const char * argv[])
char * ch1 ="a\\tb\\tc\\nA\\tB\\tC\\n";
char * ch2 ="\\n";
char * ch3 ="\\t";
int length1=0;
int length2=0;
char ** result1 = split(ch1, ch2, &length1);
for (int i=0;i<length1;i++)
// printf("%s\\n",result[i]);
char ** result2 = split(result1[i], ch3, &length2);
for (int j=0;j<length2;j++)
printf("%s--",result2[j]);
free(result2[j]); // release resource
printf("\\n");
free(result1[i]); // release resource
printf("Done\\n");
return 0;
.NET 实现 Split字符切割
昨天朋友面试安卓,笔试题。完全不考安卓,考编程基础(PS: 还完全在纸上手写)
题如下:实现Split功能
要求
功能一:实现单字符切割。如:split(\'|\');
要求二:实现对对string的切割,如:Split("abc");
于是我给出第一个版本
public static string[] SpiltStrings(this string str, char splitStr) { if (!str.EndsWith(splitStr.ToString())) { str += splitStr; } var list = new List<string>(); var temp = 0; for (int i = 0; i < str.Length; i++) { var item = str[i]; if (string.Equals(item, splitStr)) { list.Add(str.Substring(temp, i - temp)); temp = str.IndexOf(item, i); str = str.Remove(i, 1); } } return list.ToArray(); }
调用方法:
var str = "123|45||67"; var a = str.SpiltStrings(\'|\');
运行结果如下:
而 自带函数spiit的结果如下
还是有一定差距的
暂无法解决连续的“||”问题;
遇到的问题总结下:
一:foreach (var item in str)中:取str.indexOf(item);item可能字符串中存在多个。indexOf(item)永远是取第一个无法定位他正确的位置 (ps:可用indexOf(char,startIndex),麻烦)
二:主要依赖Substring函数,容易造成细节问题。难处理
三:str.Remove(index);记得要重新赋值:str = str.Remove(index);
升级版本
public static string[] SpiltStrings_s(this string str, char splitStr) { var list = new List<string>(); var sb = new StringBuilder(); if (!str.EndsWith(splitStr.ToString())) { str += splitStr; } foreach (var item in str) { sb.Append(""); if (!string.Equals(item, splitStr)) { sb.Append(item); } else { list.Add(sb.ToString()); sb = new StringBuilder(); } } return list.ToArray(); }
运行结果如下:
好了,搞定
看似简单,其实我们都是站在巨人的肩膀上。
功能二:目前没有找到自己能实现的方法,暂时贴这个。在最初版本上改的
代码如下:
public static string[] SpiltStrings(this string str, string splitStr) { var list = new List<string>(); var temp = 0; var splitLenth = splitStr.Length; var endStr = str.Substring(str.Length - splitLenth); if (!string.Equals(endStr, splitStr)) { str += splitStr; } for (var i = 0; i < str.Length; i++) { var str1 = string.Empty; for (var j = 0; j < splitLenth; j++) { if (i + j >= str.Length) { break; } str1 += str[i + j]; } if (string.Equals(str1, splitStr)) { list.Add(str.Substring(temp, i - temp)); temp = i; str = str.Remove(i, splitStr.Length); } } return list.ToArray(); }
调用:
var str1 = "12454$$454$$$4445"; var b = str1.SpiltStrings("$$");
运行结果:
也存在问题:
一:当连续出现多个时“$$$”,切割符号“$$",需求切割不明确
----------------------------------------------------------------------------------------
最后,欢迎大神贴算法解法,点不足。本人菜鸟,需要学习
以上是关于C语言中字符切割函数split的实现的主要内容,如果未能解决你的问题,请参考以下文章