C语言中字符切割函数split的实现
在项目开发中,遇到要处理字符串,但是字符串的处理没有C#、Java这样的高级语言来的方便,每次使用都得需要自己定义。先在需要用到字符切割函数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 <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];
这样的限制就无法实现动态智能分配相应的字符串数组了。
求各位高手帮帮忙,小弟感谢了。 展开
3个回答
推荐于2017-10-12 · 知道合伙人软件行家
关注
展开全部
#include <stdio.h>
#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;
}
展开全部
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 = "-\";
这样游知就可以了
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 = "-\";
这样游知就可以了
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
找了很久都没找到个靠谱的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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询