用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:\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

时间: 2024-11-07 10:44:13

用C语言来分割字符串的相关文章

C语言分割字符串

最近在做一道C语言题目的时候需要用到分割字符串,本来想自己手写的,也不会很麻烦,但想到其他语言都有分割字符串的库函数,C语言怎么会没有呢?所以,在网上搜了一搜,果然有这样的函数,还是很好用的,在此总结. 1 #include <stdio.h> 2 3 #include <string.h> 4 5 int main() 6 { 7 char in[10000]; 8 char delims[] = " "; 9 char *result; 10 11 fget

根据标识符分割字符串

常常遇到根据某个标识符分割字符串,并将分割的结果保存到字符串数组中.遇到过以下几种需求: 分隔符是一个字符集和,以便处理不同的输入格式,比如用tab或逗号分隔的输入 处理2个分隔符之间的内容为空的情况,2种需求,输出空字符串或者忽略掉 处理字符串末尾的回车符,2种需求,忽略或删除 c语言的strtok函数支持分割字符串,它在遇到分隔符之间的内容为空的时候会忽略掉空元素,往前推进返回下个非空的字符串,分割完成后返回NULL.这个函数貌似还有个多线程的版本. //分割字符串,如果遇到分割的结果是空字

【字符串】面试题之以逗号分割字符串,形成二维数组

题目: 有一个字符串符合以下特征("abcdef,acccd,eeee,aaaa,e3eeeee,sssss,"), 要求写一个函数(接口),输出以下结果 1) 以逗号分割字符串,形成二维数组,并把结果传出: 2) 把二维数组行数运算结果也传出. 请自己定义一个接口(函数). 要求1:能正确表达功能的要求,定义出接口(函数)(30分): 要求2:正确实现接口(函数),并实现功能(40分): 要求3:编写正确的测试用例.(30分). //头文件 #include <stdio.h&

R语言学习(5)-字符串和因子

字符串和因子 1.字符串 创建字符串 > c("HELLO","WORLD") [1] "HELLO" "WORLD" 使用paste函数连接字符串 > paste(c("hello","hi"),"world") [1] "hello world" "hi world" > paste(c("hel

分割字符串

#include <stdio.h> #include <string.h> /* 分割字符串 */ int main(void){ char s[100] = "123-456-789-abc-edf"; //strtok第一次调用的时候,第一个参数是字符串, //但第二次调用的时候,第一个参数是NULL const char *buf =strtok(s,"-"); while(buf){ printf("%s\n",

php分割字符串

php分割字符串的函数 1,substr $str1 = substr($str,5); echo "从第5个字符开始取至最后:".$str1."; $str2 = substr($str,9,4); echo "从第9个字符开始取4个字符:".$str2."; $str3 = substr($str,-5); echo "取倒数5个字符:".$str3."; $str4 = substr($str,-8,4); e

【语言对比】字符串

字符串是各类语言中一种非常重要的数据结构,事实上大部分的代码都是基于字符串的操作,各个语言对字符串的处理方式,也是我们评价各个语言的一个重要方面. 因为C++库中并没有提供字符串这个数据类型,所以我们以STL中提供的string来进行对比.这里不选择char*进行对比,是因为char*在功能上和其它两种语言差距实在是太大了,基本上不具有对比性,之前一直使用的都是STL,所以这里直接选用STL来对比了. JAVA中选用String及其周边类,它们会作为一个整体进行对比: 而python中的stri

java简单分割字符串内部实现

书写了一个简单版本的分割字符串 1 private static String[] mysplit(char[] myString, char c) { 2 // TODO 自动生成的方法存根 3 int count=0;///统计分割符号出现的次数 4 ///第一次遍历,统计分割符号出现的次数,那么返回的字符串数组就应该是分割数+1 5 for (int i = 0; i < myString.length; i++) { 6 if (myString[i]==c) { 7 count++;

分割字符串 ExtractStrings

//分割字符串 ExtractStrings var s: String; List: TStringList; begin s := 'about: #delphi; #pascal, programming'; List := TStringList.Create; ExtractStrings([';',',',':'],['#',' '],PChar(s),List); //第一个参数是分隔符; 第二个参数是开头被忽略的字符 ShowMessage(List.Text); //about