用符合条件的字符或字符串分割固定字符串(C++/STL)
比如说,
"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




