用C语言来分割字符串

相关:http://www.cnblogs.com/roucheng/p/cfenge.html

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

#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 */
//[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;  
} 

相关:http://www.cnblogs.com/roucheng/p/cfenge.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 接口测试用例怎么写?一文1600字教你写一个优秀的接口测试的测试用例

    接口测试用例怎么写?一文1600字教你写一个优秀的接口测试的测试用例一 用例设计 11 接口测试概念接口测试 测试系统间接口的一种测试 测试的对象主要是接口 主要是测试外部系统与所测系统之间以及内部系统之间的交互点 2 接口测试方法 a 可以通过开发脚本代码进行测试 b 可以通过开源免费的接口调用调试工具测试 如 Postman 等 c 可以通过 App 手动测试 结合抓包工具分析 如 Fillder Charles 等 3 接口测试范围接口范围包括 一 被测项目中同层之间的接口 如 DAO 层 Service 层 一个接口调用了其他的接口 二 外部系统与系统之间

    2025年6月21日
    2
  • kafka集群搭建&zookeeper集群搭建

    kafka集群搭建&zookeeper集群搭建1.安装准备jdk-8u162-linux-x64.tarzookeeper-3.4.12.tar.gzkafka_2.11-2.0.0.tgz2.准备至少三台虚拟机192.168.196.128192.168.196.131192.168.196.1323.Java环境安装(略…自行百度)4.搭建zookeeper集群在每台主机下执行以下步骤:移动至/usr/local下:mvzookeeper-3.4.12.tar.gz/usr/local解压,重命名:tar-z

    2022年6月7日
    35
  • android performClick使用

    android performClick使用performClick是使用代码主动去调用控件的点击事件(模拟人手去触摸控件)—————————————–booleanandroid.vi

    2022年7月4日
    16
  • ios9中 UIStackView的使用[通俗易懂]

    ios9中 UIStackView的使用

    2022年2月3日
    36
  • Java线程池使用说明

    Java线程池使用说明

    2021年12月3日
    58
  • 用html设计一个动漫网站_javascript登录

    用html设计一个动漫网站_javascript登录1.前端三门技术学习Web前端技术需要掌握三门基本技术:HTML,CSS,JavaScript:HTML:HTML是网页内容的载体。内容就是网页制作者放在页面上想要用户浏览的信息,可以包含文件、图片、视频等CSS:CSS样式是表现,就像网页的外衣比字体、颜色变化等JavaScript:JavaScript用来实现网页上的特效效果。比如鼠标滑过弹出下拉菜单、鼠标滑过北京颜色改变等本次项目主要是介绍海贼王主题的简介,使用html+css+javascript来制作网站,实现项目的效果;index.h

    2022年8月23日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号