zoukankan      html  css  js  c++  java
  • 用C语言来分割字符串

    #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:
    %s
    %s
    %s
    ",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 != '')  
         {  
             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 = '';  
             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 != '')  
         {  
            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 = '';  
            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
    ",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
    ",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
    ",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
    ",array2.number,i,array2.string[i]);  
         }  
      
         return 0;  
    } 

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

  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/roucheng/p/cyyfenge.html
Copyright © 2011-2022 走看看