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

用符合条件的字符或字符串分割固定字符串(C++/STL)

楼主du51(郁郁思扬)2006-07-04 03:56:11 在 C/C++ / C++ 语言 提问

比如说,  
  "i   love   you,do   you   love   me-by   xxx@gmail.com"  
  分割成  
  i  
  love  
  you  
  do  
  you  
  love  
  me  
  by  
  xxx  
  gmail  
  com  
  有没有简单的办法?  
   
   
  问题点数:59、回复次数:13Top

1 楼tw_26()回复于 2006-07-04 07:16:36 得分 5

用两个指针,分别指出当前切割出的字符串的首和尾,若当前字符不符合要求时,字符串被切割,并重新设置首尾指针.  
   
  呵呵,没事瞎转悠,不知道有没有更简单的方法.Top

2 楼pottichu(拉拉是头猪)回复于 2006-07-04 08:21:46 得分 10

不知道这个行不行,呵呵:  
   
  void   test(string   line)  
  {  
  const   string   delims("   ,@.");  
   
  string::size_type   begIdx,   endIdx;  
  begIdx   =   line.find_first_not_of(delims);  
  while(begIdx   !=   string::npos)  
  {  
  endIdx   =   line.find_first_of(delims,   begIdx);  
  if(endIdx   ==   string::npos)  
  {  
  endIdx   =   line.length();  
  }  
   
  for(int   i   =   static_cast<int>(begIdx);   i<endIdx;   i++)  
  {  
  cout<<line[i];  
  }  
   
  cout<<endl;  
  begIdx   =   line.find_first_not_of(delims,   endIdx);  
  }  
  cout<<endl;  
  }  
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  string   str1("i   love   you,do   you   love   me-by   xxx@gmail.com");  
   
  test(str1);  
  }  
  Top

3 楼loomman(一剑)回复于 2006-07-04 08:26:17 得分 10

#include   <string.h>  
  #include   <stdio.h>  
   
  char   string[]   =   "A   string\tof   ,,tokens\nand   some     more   tokens";  
  char   seps[]       =   "   ,\t\n";  
  char   *token;  
   
  void   main(   void   )  
  {  
        printf(   "%s\n\nTokens:\n",   string   );  
        /*   Establish   string   and   get   the   first   token:   */  
        token   =   strtok(   string,   seps   );  
        while(   token   !=   NULL   )  
        {  
              /*   While   there   are   tokens   in   "string"   */  
              printf(   "   %s\n",   token   );  
              /*   Get   next   token:   */  
              token   =   strtok(   NULL,   seps   );  
        }  
  }  
   
   
  Output  
   
  A   string       of   ,,tokens  
  and   some     more   tokens  
   
  Tokens:  
    A  
    string  
    of  
    tokens  
    and  
    some  
    more  
    tokens  
   
  Top

4 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-07-04 09:02:15 得分 0

还是用strtok比较方便一些Top

5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-04 09:03:26 得分 5

strtok   不是满好用的?  
  一定要用   stl   么?      
  ========  
  呵呵,   du51   (郁郁思扬)看你搞这个有点时间了嘛Top

6 楼Could(翻墙鹦鹉)回复于 2006-07-04 09:18:03 得分 10

http://frankly.blog.edu.cn/user2/60478/archives/2006/1128583.shtmlTop

7 楼du51(郁郁思扬)回复于 2006-07-04 10:08:56 得分 0

谢谢楼上各位.  
  楼上的方法都是对字符串本身就行分析.  
  我不知道怎么说我的想法.  
  比如说,这样实现.  
  #include<iostream>  
  #include<sstream>  
  #include<vector>  
  #include<algorithm>  
  #include<iterator>  
  using   namespace   std;  
  int   main()  
  {  
          string   str="208.4   140.0   208.4   034   59.9   2.05   35.0   00110000",temp;  
          stringstream   sstr(str);  
          vector<string>   MsgBox;  
          while(getline(sstr,temp,'.'))//此处,为'.'这就是分割符.  
          {  
                  MsgBox.push_back(temp);  
          }  
          copy(MsgBox.begin(),MsgBox.end(),ostream_iterator<string>(cout,"\n"));  
          system("PAUSE");  
          return   0;  
  }  
   
  这样的话,几乎是直接从字符串里往外读的.关键是getline(istream,buffer,'.')不支持函数对象.  
  能不能重载一下,或者有其它方法.  
   
  不过,今天我第一次知道strtok还能用字符串.我原来一直以为只能用一个字符的.汗!!!  
  再次谢谢楼上各位.  
  Top

8 楼hzhxxx(程序方程)回复于 2006-07-04 15:04:15 得分 5

 
   
  自己写一个    
  bool   split(const   std::string   &src,const   std::string   &div,std::vector<std::string>   &cons)  
  {  
   
  }Top

9 楼Oversense(步步文)回复于 2006-07-04 15:05:11 得分 5

boost的字符串库Top

10 楼tidyduck(辨不清东南西北)回复于 2006-07-04 16:26:56 得分 5

以前写过一个和这个差不多的,呵呵!  
  //文本文件分单词输出  
  #include   <iostream>  
  #include   <vector>  
  #include   <string>  
  #include   <strstream>  
  #include   <fstream>  
  #include   <boost/algorithm/string/trim.hpp>  
   
  using   namespace   std;  
  using   namespace   boost;  
   
  typedef   vector<string>::iterator   strIter;  
   
  int   main()  
  {  
  ifstream   infile("C:\\test.txt");  
  string   strline;//读入行  
  string   strPiece;//读入单词  
  vector<string>   words;  
   
  while   (infile)  
  {  
  getline(infile,strline);  
  trim(strline);  
  istrstream   istrS(strline.c_str());  
   
  while   (istrS)  
  {  
  istrS>>strPiece;  
  char   c;  
  if   ((c=istrS.peek())==EOF)  
  {  
  istrS.setstate(ios::failbit);  
  }  
   
  words.push_back(strPiece);  
  }  
   
  if   (infile.peek()==EOF)  
  {  
  infile.setstate(ios::failbit);  
  }  
   
   
  }  
  strIter   myStrIter=words.begin();  
   
  while   (myStrIter!=words.end())  
  {  
  cout<<*myStrIter<<endl;  
  myStrIter++;  
  }  
   
  system("pause");  
  return   0;  
  }Top

11 楼ahao(天·狼·星星)回复于 2006-07-04 23:51:53 得分 3

有现成的库干吗不用?Top

12 楼mxfeng(老子说:善战者不怒)回复于 2006-07-05 10:40:13 得分 1

楼主**星,是在骗我们吧?  
   
  不会!!!Top

13 楼du51(郁郁思扬)回复于 2006-07-07 10:03:21 得分 0

我本意是.从输入流里直接读..在读的过程中,区别一下即可.要是getline支持函数对象,这会很简单..  
  因为STL还没看完.所以,不知道有没有什么好方法.  
  pottichu和loomman都是解析字符串的.后者的快一点.  
  Could无非是封装一下.还是解析的.  
  tidyduck的要实现只用几行.根本不用这么复杂.  
   
   
  算了.散分..Top

相关问题

关键词

得分解答快速导航

  • 帖主:du51
  • tw_26
  • pottichu
  • loomman
  • jixingzhong
  • Could
  • hzhxxx
  • Oversense
  • tidyduck
  • ahao
  • mxfeng

相关链接

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

广告也精彩

反馈

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