前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用C语言来分割字符串

用C语言来分割字符串

作者头像
全栈程序员站长
发布2022-07-18 14:18:36
7040
发布2022-07-18 14:18:36
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君

代码语言:javascript
复制
#include <stdio.h>  
int main()  
{  
    char str1[10] = {0};  
    char str2[10] = {0};  
    char str3[10] = {0};  
    sscanf("1,2,3#3,4#4,5","%[^#]#%[^#]#%[^#]", str1, str2,str3);  
    printf("The split result is:\n%s\n%s\n%s\n",str1, str2,str3);  
    return 0;  
}  /* 何问起 hovertree.com */
代码语言:javascript
复制
//[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)  
  
//2008-11-8: 函数StringSplit(分割字符串到一个字符串数组中,其中该数组第0位为分割后字符串的个数)  
//2008-11-10: 函数StringSplit_Struct(以定义一个新结构的方式来实现该函数)  
/*C代码如下*/  
#include <stdio.h>  
  
/*实现方案1*/  /* 何问起 hovertree.com */
/*分割字符串到一个字符串数组中,其中该数组第一位为分割后的个数*/  
char** StringSplit(const char* string,const char* split)  
{  
     char** result;  
     /*首先分配一个char*的内存,然后再动态分配剩下的内存*/  
     result = (char * * )malloc(sizeof(char *)*1);  
     memset(result,0,sizeof(char *)*1);  
     /*定义一个遍历用的指针和一个寻找位置用的指针*/  
     char* p = string;  
     char* pos = string;  
     /*无论是否存在该分割串,绝对都会分割到一个字符串*/  
     int count = 1;  
     while(*p != '\0')  
     {  
         char* temp;  
         char* tt;  
         /*查找该字符串*/  
         pos = strstr(p,split);  
         /*结果为0说明剩下的字符串中没有该字符了*/  
         if(pos == 0)  
         {  
           result = (char * * )realloc(result,sizeof(char *)*(count+2));  
           result[0] = count;  
           result[count] = p;  
           result[count+1] = NULL;  
           return result;  
         }  
         /*分配临时字符串空间*/  
         temp = (char * )malloc(sizeof(char)*(pos - p+1));  
         memset(temp,0,sizeof(char)*(pos - p+1));  
         /*设置头指针,以便赋值时使用*/  
         tt = temp;  
         while(p<=pos)  
         {  
           *temp++ = *p++;  
         }  
         /*将字符串结尾置零*/  
         *--temp = '\0';  
         result = (char * * )realloc(result,sizeof(char *)*(count+1));  
         result[0] = count;  
         result[count] = tt;  
         count++;  
         /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/  
         p +=strlen(split)-1;  
     }  
     return result;  
}  
/*实现方案2*/  /* 何问起 hovertree.com */
/*为方便计数定义的结构,字符串数组从0开始赋值*/  
typedef struct{  
     int number;        /*分割的字符串个数*/  
     char** string;        /*字符串数组*/  
}StringTab;  
/*分割字符串到一个字符串数组中*/  
StringTab StringSplit_Struct(const char* string,const char* split)  
{  
     StringTab result;  
     /*首先分配一个char*的内存,然后再动态分配剩下的内存*/  
     result.string = (char * * )malloc(sizeof(char *)*1);  
     memset(result.string,0,sizeof(char *)*1);  
     /*无论是否存在该分割串,绝对都会分割到一个字符串*/  
     result.number = 0;  
     /*定义一个遍历用的指针和一个寻找位置用的指针*/  
     char* p = string;  
     char* pos = string;  
     while(*p != '\0')  
     {  
        char* temp;  
        char* tt;  
        /*查找该字符串*/  
        pos = strstr(p,split);  
        /*结果为0说明剩下的字符串中没有该字符了*/  
        if(pos == 0)  
        {  
          result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));  
          result.string[result.number] = p;  
          return result;  
        }  
        /*分配临时字符串空间*/  
        temp = (char * )malloc(sizeof(char)*(pos - p+1));  
        memset(temp,0,sizeof(char)*(pos - p+1));  
        /*设置头指针,以便赋值时使用*/  
        tt = temp;  
        while(p<=pos)  
        {  
          *temp++ = *p++;  
        }  
        /*将字符串结尾置零*/  
        *--temp = '\0';  
        result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));  
        result.string[result.number] = tt;  
        /*计数器加一*/  
        result.number++;  
        /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/  
        p +=strlen(split)-1;  
     }  
     return result;  
}  
  
int main()  
{  
     /*进行测试*/ /* 何问起 hovertree.com */ 
     /*方案1测试*/  
     char** array;  
     array = StringSplit("a/aaa//哈aa","aaa");  
     int i ;  
     for(i=1;i<=(int)array[0];i++)  
     {  
         printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);  
     }  
     
     array = StringSplit("a/aa哈a//哈aa","哈");  
     for(i=1;i<=(int)array[0];i++)  
     {  
         printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);  
     }  
  
     /*方案2测试*/  
     StringTab array2;  
     array2 = StringSplit_Struct("a/aaa//哈aa","aaa");  
     for(i=0;i<=array2.number;i++)  
     {  
        printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);  
     }  
     array2 = StringSplit_Struct("a/aa哈a//哈aa","哈");  
     for(i=0;i<=array2.number;i++)  
     {  
        printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);  
     }  
  
     return 0;  
} 

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120345.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档