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];
这样的限制就无法实现动态智能分配相应的字符串数组了。
求各位高手帮帮忙,小弟感谢了。
展开
 我来答
lgao622
推荐于2017-10-12 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6550
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部
#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;
}

百度网友a3722676e
推荐于2018-03-25 · TA获得超过1215个赞
知道小有建树答主
回答量:957
采纳率:0%
帮助的人:865万
展开全部
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 = "-\";
这样游知就可以了
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e98bef7
2018-10-03
知道答主
回答量:4
采纳率:100%
帮助的人:2.2万
展开全部

找了很久都没找到个靠谱的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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式