#include <stdio.h>
int main()
{
char str1[] = {};
char str2[] = {};
char str3[] = {};
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 ;
} /* 何问起 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 *)*);
memset(result,,sizeof(char *)*);
/*定义一个遍历用的指针和一个寻找位置用的指针*/
char* p = string;
char* pos = string;
/*无论是否存在该分割串,绝对都会分割到一个字符串*/
int count = ;
while(*p != '\0')
{
char* temp;
char* tt;
/*查找该字符串*/
pos = strstr(p,split);
/*结果为0说明剩下的字符串中没有该字符了*/
if(pos == )
{
result = (char * * )realloc(result,sizeof(char *)*(count+));
result[] = count;
result[count] = p;
result[count+] = NULL;
return result;
}
/*分配临时字符串空间*/
temp = (char * )malloc(sizeof(char)*(pos - p+));
memset(temp,,sizeof(char)*(pos - p+));
/*设置头指针,以便赋值时使用*/
tt = temp;
while(p<=pos)
{
*temp++ = *p++;
}
/*将字符串结尾置零*/
*--temp = '\0';
result = (char * * )realloc(result,sizeof(char *)*(count+));
result[] = count;
result[count] = tt;
count++;
/*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/
p +=strlen(split)-;
}
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 *)*);
memset(result.string,,sizeof(char *)*);
/*无论是否存在该分割串,绝对都会分割到一个字符串*/
result.number = ;
/*定义一个遍历用的指针和一个寻找位置用的指针*/
char* p = string;
char* pos = string;
while(*p != '\0')
{
char* temp;
char* tt;
/*查找该字符串*/
pos = strstr(p,split);
/*结果为0说明剩下的字符串中没有该字符了*/
if(pos == )
{
result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+));
result.string[result.number] = p;
return result;
}
/*分配临时字符串空间*/
temp = (char * )malloc(sizeof(char)*(pos - p+));
memset(temp,,sizeof(char)*(pos - p+));
/*设置头指针,以便赋值时使用*/
tt = temp;
while(p<=pos)
{
*temp++ = *p++;
}
/*将字符串结尾置零*/
*--temp = '\0';
result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+));
result.string[result.number] = tt;
/*计数器加一*/
result.number++;
/*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/
p +=strlen(split)-;
}
return result;
} int main()
{
/*进行测试*/ /* 何问起 hovertree.com */
/*方案1测试*/
char** array;
array = StringSplit("a/aaa//哈aa","aaa");
int i ;
for(i=;i<=(int)array[];i++)
{
printf("Num:%d I:%d: Value: %s\n",array[],i,array[i]);
} array = StringSplit("a/aa哈a//哈aa","哈");
for(i=;i<=(int)array[];i++)
{
printf("Num:%d I:%d: Value: %s\n",array[],i,array[i]);
} /*方案2测试*/
StringTab array2;
array2 = StringSplit_Struct("a/aaa//哈aa","aaa");
for(i=;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=;i<=array2.number;i++)
{
printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);
} return ;
}

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

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

  1. Swift3.0语言教程分割字符串与截取字符串

    Swift3.0语言教程分割字符串与截取字符串 Swift3.0语言教程分割字符串 如果想要快速的创建一个数组,我们可以将字符串进行分割,分割后的内容将会生成一个数组.在NSString中有两个分割字 ...

  2. C语言分割字符串

    最近在做一道C语言题目的时候需要用到分割字符串,本来想自己手写的,也不会很麻烦,但想到其他语言都有分割字符串的库函数,C语言怎么会没有呢?所以,在网上搜了一搜,果然有这样的函数,还是很好用的,在此总结 ...

  3. LinuxC语言读取文件,分割字符串,存入链表,放入另一个文件

    //file_op.c #include <string.h> #include <stdio.h> #include <stdlib.h> struct info ...

  4. R语言︱文本(字符串)处理与正则表达式

    处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...

  5. R语言中的字符串处理函数

    内容概览   尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串有时候也会在数据分析中占到相当大的份量.   R语言是一个擅长处理数据的语言,但是也不可避免的需要处理一些字符串(文本数据).如何高 ...

  6. Go语言中的字符串处理

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(“”)或反 ...

  7. 【R笔记】R语言中的字符串处理函数

    内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串同样极为重要.从医疗研究数据里的出生日期到文本挖掘的应用,字符串数据在R程序中使用的频率非常高.R语言提供了很多字符串操作函数,本文仅简 ...

  8. Tcl/Tk语言学习------拆分字符串

    字符串的拆分 前言 字符串的处理是每种语言经常会遇到的问题,tcl作为一门脚本语言自然也不例外,关于字符串的拆分,一般会有两种情况:1.使用单个字符拆分,2.使用字符串拆分. 1.使用单个字符拆分字符 ...

  9. Delphi中stringlist分割字符串的用法

    Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...

随机推荐

  1. 一天一小段js代码(no.2)

    (一)可以用下面js代码来检测弹出窗口是否被屏蔽: var blocked = false ; try { /*window.open()方法接受4个参数window.open(要加载的url,窗口目 ...

  2. [stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

    SIM8008是四频模块,全球可用.含有TTL电平接口等接口,能够实现发短信.打电话.GPRS传输数据.GPS等功能.[正版资料请找beautifulzzzz·博客园] 一些细节: >> ...

  3. WaterfallTree(瀑布树) 详细技术分析系列

    前言 WaterfallTree(瀑布树) 是最强纯C#开源NoSQL和虚拟文件系统-STSdb专有的(版权所有/专利)算法/存储结构. 参考 关于STSdb,我之前写过几篇文章,譬如: STSdb, ...

  4. Windows Azure Virtual Machine (25) 使用SSH登录Azure Linux虚拟机

    <Windows Azure Platform 系列文章目录> 本文介绍内容适合于Azure Global和Azure China 为什么使用SSH登录Azure Linux虚拟机? 我们 ...

  5. 远程调试 Azure Web App

    当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应 ...

  6. 哪些JavaScript IDE最好用?

    阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最高,占比达到42.84%,因此掌握JavaScript语言好工作就不愁啦,工欲善其事必先利其器,那么选择IDE来开发是至关重要的 ...

  7. P,NP,NP_hard,NP_complete问题定义

    背景:在看李航的<统计学习方法时>提到了NP完全问题,于是摆之. 问题解答:以下是让我豁然开朗的解答的摘抄: 最简单的解释:P:算起来很快的问题NP:算起来不一定快,但对于任何答案我们都可 ...

  8. 缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续

    返回目录 在写完首篇cache文章后,有些朋友给我来信,希望可以使用JS的方法来实现这个导航功能,所以,才有了这篇文章,JS与C#不同,它虽然有引用类型,但它不具备一些引用类型的特性,如它的方法参数为 ...

  9. 转 jsp中 session的简单用法

    Session对象:是用来分别保存每一个用户信息的对象,以便于跟踪用户的操作状态.Session的信息保存在服务端,Session的ID保存在客户机的Cookie中.事实上,在许多服务器上,如果浏览器 ...

  10. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

    Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...