CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请问:C里面有没有类似VB的split函数?

楼主zjpixyniannian()2006-02-22 14:56:41 在 C/C++ / C语言 提问

比如字符串  
  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

相关问题

  • C#中怎么实现VB中的split函数的功能?
  • C#有没有像VB的InputBox函数?
  • 如何用vb。net调用c#函数???
  • C#中如何用split函数?
  • VB中Split函数的用法?
  • 这个C/C++函数 怎么转化为VB的 帮帮忙
  • c++函数
  • C函数
  • VB函数
  • vb函数

关键词

  • 函数
  • null
  • duancount
  • split
  • 字符串
  • 分隔符
  • 缓冲区
  • parm
  • bsc
  • field

得分解答快速导航

  • 帖主:zjpixyniannian
  • kimsea
  • flyintoy
  • mengge
  • ywchen2000
  • wshcdr

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo