请问:C里面有没有类似VB的split函数?
比如字符串
100|200|300|400
我想用一个函数根据"|"一次把这个字符串分成4个子字符串,有类似的函数吗?
问题点数:30、回复次数:7Top
1 楼kimsea(小鸟)回复于 2006-02-22 15:02:49 得分 1
好像没有吧,自己写 :)Top
2 楼flyintoy(挖出你的灵魂)回复于 2006-02-22 15:02:52 得分 9
好像没有,我自己实现了一个:
/***************************************************************************************************
*@author Copyright (C) 2005, 2008 Blueshy <blueshycool@163.com>
*
*@filename bsc_split.c
*@created 2006/02/18
*
*@platform WIN32(Windows2003)+Suse10.0
**************************************************************************************************/
/**
* 存在的局限性
* 1,只支持一个分隔符的情况
* 2,存储缓冲区要有足够大的空间,如果没有足够大的空间将与不存在域返回结果一样都是NULL,这样将不易明确是哪一种情况
*/
#ifndef NULL
# ifdef __cplusplus
# define NULL 0
# else
# define NULL ((void*) 0)
# endif
#endif
static const char* get_field(const char* line, char split, int field, int* len);
/**
* @function bsc_split_field 根据所给域值取得分隔串中相应域的值
*
* @parm buffer 值缓冲区
* @parm size 缓冲区大小
* @parm field 所要取得的域
* @parm line 分隔串
* @parm split 分隔符
*
* @return NULL/buffer(如果不存在域或空行返回NULL)
**/
const char* bsc_split_field(char* buffer, int size, int field, const char* line, int split)
{
int i;
int len;
char* p_field;
if(buffer == NULL)
return NULL;
len = 0;
p_field = NULL;
p_field = (char*)get_field(line, split, field, &len);
for(i=0; i<size; i++)
{
buffer[i]='\0';
}
if(p_field != NULL)
{
if(size <= len) /* 所给空间不够长 */
{
return NULL;
}
i = 0;
while(i < len)
{
buffer[i] = p_field[i++];
}
}
else /* 没有这么多域或是空域 */
{
return NULL;
}
return buffer;
}
/**
* @function get_field 取得field的起始地址和field域长
*
* @parm line 分隔行
* @parm split 分隔符
* @parm len 域长地址
*
* @return NULL/p_ret(域起始地址,空行返回NULL,空域返回"\0")
**/
static const char* get_field(const char* line, char split, int field, int* len)
{
char* p_line;
char* p_ret;
/* split真的只是<0吗?split是char还是int */
if(line==NULL || len==NULL || split<0 || split<0)return NULL;
p_ret = p_line = (char*)line; /* 前后没有分隔符 */
while(*p_line)
{
if(*p_line == '\n')
{
break;
}
if(*p_line++ == split)
{
--field;
}
if(field == 0)
{
--field;
p_ret = p_line;
}
if(field == -1)
{
(*len)++;/* 当那个域为空值时 */
}
if(field == -2)
{
--(*len);
return p_ret;
}
}
if(*len > 0)
{
return p_ret;
}
return NULL;
}
Top
3 楼zjpixyniannian()回复于 2006-02-22 15:26:34 得分 0
我想到一个办法,把|这样的分隔符先用\t替代,然后用sscanf,不过这有对于原来的字符串一些要求,比如本身中不能有\t字符等,呵呵
Top
4 楼mengge(踏岸寻柳)回复于 2006-02-22 18:12:53 得分 6
试一试strtokTop
5 楼ywchen2000(灌水大帝:努力奋斗)回复于 2006-02-23 18:56:36 得分 0
markTop
6 楼ywchen2000(灌水大帝:努力奋斗)回复于 2006-02-23 22:35:06 得分 8
char** split(char *string,char ch,int* count)
{
char *p=string;
char **value;
long i=0,len=0,duancount=0,strlens;
char c;
strlens=strlen(string)+1;
if(*p=='\0')
{
return NULL;
}
while((c=*p++)!='\0')
{
if(c==ch && *p!='\0')
{
if(duancount==0)
duancount=2;
else
duancount++;
}
else if(c==ch && *p=='\0')
{
if(duancount==0) duancount++;
}
}
if(duancount==0) { *count=duancount; return NULL;}
else { *count=duancount;}
value=(char **)malloc(duancount*sizeof(char*)); /*0 0 0 0 0 0 0 0 0*/
value[i]=(char *)malloc(strlens*sizeof(char)); /*0 0 0 0 0 0 0 0 0*/
p=string;
while((c=*p++)!='\0')
{
if(c==ch && *p=='\0')
{
*(value[i]+len)='\0';
break;
}
if(c!=ch && *p=='\0')
{
*(value[i]+len)=c;
len++;
*(value[i]+len)='\0';
break;
}
if(c==ch)
{
*(value[i]+len)='\0';
i++;
value[i]=(char *)malloc(strlens*sizeof(char));
len=0;
continue;
}
*(value[i]+len)=c;
len++;
}
p=NULL;
return value;
}Top
7 楼wshcdr(dd)回复于 2006-02-26 15:03:51 得分 6
参考strtokTop




