- 论坛徽章:
- 0
|
为什么要用 c++ 来处理呢?
这个题目完全可以抛弃c++的用法
- #include <stdio.h>
- // Segment numbers
- #define _SEGS 5
- // Segment names
- static const char * segnames[] = { "User", "Pass", "Addr", "Path", "File" };
- // Segment separators
- static const char * segseps[] = { ":", "@", ":", "/", NULL };
- // Segment matching method
- static const unsigned int segmethods[] = { 0, 0, 0, 1, 0 };
- // Error detail string
- static const char * errstrings[] = { "Parse user name error.",
- "Parse user pass error.",
- "Parse ip address error.",
- "Parse file path error.",
- "Parse file name error." };
- static int lasterr = -1;
- // Release memories from HEAP
- void freesegs( char ** segs, unsigned num ) {
- unsigned int i = 0;
- for( ; i < num; i ++ ) {
- if( segs[i] ) {
- free( segs[i] );
- segs[i] = NULL;
- }
- }
- return;
- }
- // Alloc memory and fill them
- int fillsegs( char ** segs, char * start, unsigned len ) {
- * segs = (char *)malloc( sizeof( char ) * ( len + 1 ) );
- if( ! *segs ) {
- return( -1 );
- }
-
- memset( * segs, 0, len + 1 );
- memcpy( * segs, start, len );
-
- return( 0 );
- }
- // Get one segment from 'src'
- int getoneseg( char ** segs, unsigned index, char * src, const char * tag, const unsigned int matchlast ) {
- char * p = NULL, * q = NULL;
- if( ! * src )
- return( -1 );
- if( ! tag ) { // the last segment
- p = src + strlen( src );
- if( fillsegs( &segs[index], src, p - src ) < 0 ) {
- freesegs( segs, _SEGS );
- return( -1 );
- }
- return( p - src );
- }
- if( ! matchlast ) {
- p = strstr( src, tag );
- if( !p ) {
- freesegs( segs, _SEGS );
- return( -1 );
- }
- } else {
- p = src;
- while( p = strstr( p, tag ) ) {
- q = p;
- p ++;
- if( ! *p ) {
- freesegs( segs, _SEGS );
- return( -1 );
- }
- }
- p = q;
- if( !p ) {
- freesegs( segs, _SEGS );
- return( -1 );
- }
- }
- if( fillsegs( &segs[index], src, p - src ) < 0 ) {
- freesegs( segs, _SEGS );
- return( -1 );
- }
- return( p - src );
- }
- // Output all segs
- void printsegs( char ** segs, unsigned int num ) {
- unsigned int i = 0;
- for( ; i < num; i ++ ) {
- printf( "[%s]\t%s\n", segnames[i], segs[i] );
- }
- printf( "\n" );
- return;
- }
- int ExtractSegs( char * src, char ** segs ) {
- char * p = src;
- int ret = 0;
- unsigned int i = 0;
-
- // Get all segments
- for( ; i < _SEGS; i ++ ) {
- ret = getoneseg( segs, i, p, segseps[i], segmethods[i] );
- if( ret < 0 ) {
- lasterr = i;
- return( ret );
- }
-
- p = p + ret + 1;
- }
- return( 0 );
- }
- int main( void ) {
- char * file1 = "kevin:pass@127.0.0.1:/var/path/kevin/demo.cpp";
- char * segs[_SEGS] = { 0 };
-
- if( ExtractSegs( file1, segs ) < 0 ) {
- if( lasterr > -1 ) {
- printf( "[ERROR]: %s\n\n", errstrings[lasterr] );
- } else {
- printf( "[ERROR]: Unknown Error!\n\n" );
- }
-
- exit( 1 );
- }
- // Output all segs
- printsegs( segs, _SEGS );
- // Release memories from HEAP
- freesegs( segs, _SEGS );
- return( 0 );
- }
复制代码
[ 本帖最后由 xB1ue 于 2007-10-23 12:15 编辑 ] |
|