- 论坛徽章:
- 14
|
我写了个示范,你再改改
用了两种方法分割,你选择其中一个就行了- #include <iostream>
- #include <sstream>
- #include <list>
- #include <string>
- #include <cstring>
- using namespace std;
- // 使用C++的stringstream配合getline进行分割
- bool foo_cpp( const char* data, std::string& id, std::list<std::string>& subs )
- {
- subs.clear();
- istringstream is( data );
-
- getline( is, id, ':' );
- if( !is ) return false;
- for( string sub; getline(is,sub,'|'); )
- {
- if( sub.size()<2 || sub[0]!='{' || sub[sub.size()-1]!='}' )
- return false;
- subs.push_back( sub );
- }
- return true;
- }
- // 使用C的strchr进行分割
- bool foo_c( const char* data, std::string& id, std::list<std::string>& subs )
- {
- subs.clear();
- const char* p = strchr( data, ':' );
- if( !p )
- return false;
- id = string( data, p-data );
- const char* p1 = p+1;
- for( const char* p2; (p2=strchr(p1,'|'))!=NULL; p1=p2+1 )
- {
- if( *p1!='{' || p2[-1]!='}' )
- return false;
- subs.push_back( string(p1,p2-p1) );
- }
- if( *p1 )
- {
- if( *p1!='{' || p1[strlen(p1)-1]!='}' )
- return false;
- subs.push_back( p1 );
- }
- return true;
- }
- // 测试函数
- void test( bool (&foo)(const char* data, std::string& id, std::list<std::string>& subs), const char* data )
- {
- string id;
- list<string> subs;
- bool r = foo( data, id, subs );
- if( !r )
- {
- cerr << "Error!!!\n";
- return;
- }
- cout << "<SIZE=" << subs.size() << "> ";
- cout << id << (subs.empty()?":":"");
- for( list<string>::const_iterator itor=subs.begin(); itor!=subs.end(); ++itor )
- cout << (itor==subs.begin()?':':'|') << *itor;
- cout << endl;
- }
- int main()
- {
- test( foo_cpp, "id000:{ABC}|{}|{BCD}" );
- test( foo_cpp, "id001:{ABC}" );
- test( foo_cpp, "id002:" );
- test( foo_c, "id000:{ABC}|{}|{BCD}" );
- test( foo_c, "id001:{ABC}" );
- test( foo_c, "id002:" );
- return 0;
- }
复制代码 |
|