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

  • 相关阅读:
    jq-demo-阻止冒泡,阻止默认行为
    jq-demo-轮播图
    jq-demo-点击选择(英雄联盟)
    jq-demo-tab切换
    jq-demo-拖拽
    hdu 4031 Attack 线段树
    codeforces 633C. Spy Syndrome 2 hash
    sublime模式下开启vim并修改esc
    codevs 1256 打鼹鼠 LIS
    codevs 1455 路径 计算m^n%p
  • 原文地址:https://www.cnblogs.com/roucheng/p/cyyfenge.html
Copyright © 2011-2022 走看看