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 <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;

参考技术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的实现的主要内容,如果未能解决你的问题,请参考以下文章

c语言的split字符串分割(函数strtok)

C语言split分割字符串。

C语言字符串分割

C语言工具函数

.NET 实现 Split字符切割

c语言切割字符串存入数组?