免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5990 | 回复: 15
打印 上一主题 下一主题

解析字符串的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-23 00:49 |只看该作者 |倒序浏览
一字符串格式为 usr:pwd@ip:path/file  我想把他们截取出来 分为5部分
程序写好了 编译通过 但是结果有问题....谁能帮我看看?或者给个answer...
我猜可能是我一些函数没用好 strncpy memccpy 之类的
#include <cstdlib>
#include <iostream>
#include <tchar.h>
#include <ctime>

#include <stdio.h>
#include <string.h>


char* ExtractName( char *fullname)
{
        char* usr ="";
        char* pwd ="";
        char* ip ="";
        char* path ="";
        char* file ="";
        char* temp ="";
    char* name ="";
    int rpos = 0;
        int lpos = 0;
        name = fullname;
  char* dest;
  
  int at = -1;
  
  for(int ii =strlen(fullname)-1; ((ii > 0) && (at < 0)); ii--) //get pos of '@'
     {
        if (fullname[ii] == '@')
                {
                 at = ii;
                }
     }
   
  int colon1 = -1;
  //get the first colon betweet usr & pwd
  for(int lpos = at-1; ((rpos > 0) && (colon1 < 0)); lpos--)
          {
           if(fullname[lpos] == ':')
                   {
                 colon1 = lpos;           
          // get string of usr & pwd
                   strncpy(usr,fullname,colon1-1);
                 usr[colon1] = '\0';
                 strchr(temp,':'); // string after first ':'
                 memccpy(pwd,temp,'@',at-lpos);

               
                  }
          }        
   
    temp = strchr(temp, '@');//get the string after '@'
   
int colon2 = -1;

//get the second colon between ip & full path
for(int rpos = strlen(temp)-1; ((rpos > 0) && (colon2 < 0)); rpos--)
          {
           if(fullname[rpos] == ':')
                   {
                 colon2 = rpos;           
               strncpy(ip, temp, colon2-1);// get string of ip
         ip[colon2] = '\0';
         temp = strchr(temp, ':'); //get the string of 'fullpath'
                  }
          }
  int slash = -1;
  for (int jj=strlen(temp)-1; ((jj > 0 ) && (slash < 0)) ; jj--)//the pos of  last '/'
    {
             if(fullname[jj] == '/')
        {
                slash = jj;
                strncpy(path, temp, slash);   //get path
                path[slash] = '\0';
        file = strrchr(temp,'/');
        

        }               
   
     }
                       std::cout << usr <<   endl
                    << path << endl;
}        
   
  int   main(int   argc,char   *argv[])   
  {   
        char*   file1   = "kevin:pass@127.0.0.1:/var/path/kevin/demo.cpp" ;
        char* s = ExtractName( file1);
        printf("%s",s);
       

  }

[ 本帖最后由 coolfire666 于 2007-10-23 01:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-10-23 01:46 |只看该作者
try strtok

论坛徽章:
0
3 [报告]
发表于 2007-10-23 08:44 |只看该作者
位移1=str.find(标志,位移)
C++程序中应该少用c中的字符串操作函数,现在的string类已经可以满足我们的基本需求了

论坛徽章:
0
4 [报告]
发表于 2007-10-23 09:28 |只看该作者
这就是C和C++混在一起的效果
该怎么说呢……

真的是哦,要好好学C++,必需把原来C的用法给抛弃
用类的对象方法来操作

论坛徽章:
0
5 [报告]
发表于 2007-10-23 12:09 |只看该作者
为什么要用 c++ 来处理呢?
这个题目完全可以抛弃c++的用法


  1. #include <stdio.h>

  2. // Segment numbers
  3. #define _SEGS        5

  4. // Segment names
  5. static const char * segnames[] = { "User", "Pass", "Addr", "Path", "File" };

  6. // Segment separators
  7. static const char * segseps[] = { ":", "@", ":", "/", NULL };

  8. // Segment matching method
  9. static const unsigned int segmethods[] = { 0, 0, 0, 1, 0 };

  10. // Error detail string
  11. static const char * errstrings[] = { "Parse user name error.",
  12.                                      "Parse user pass error.",
  13.                                      "Parse ip address error.",
  14.                                      "Parse file path error.",
  15.                                      "Parse file name error." };

  16. static int lasterr = -1;

  17. // Release memories from HEAP
  18. void freesegs( char ** segs, unsigned num ) {
  19.     unsigned int i = 0;
  20.     for( ; i < num; i ++ ) {
  21.         if( segs[i] ) {
  22.             free( segs[i] );
  23.             segs[i] = NULL;
  24.         }
  25.     }

  26.     return;
  27. }

  28. // Alloc memory and fill them
  29. int fillsegs( char ** segs, char * start, unsigned len ) {
  30.     * segs = (char *)malloc( sizeof( char ) * ( len + 1 ) );
  31.     if( ! *segs ) {
  32.         return( -1 );
  33.     }
  34.    
  35.     memset( * segs, 0, len + 1 );
  36.     memcpy( * segs, start, len );
  37.    
  38.     return( 0 );
  39. }

  40. // Get one segment from 'src'
  41. int getoneseg( char ** segs, unsigned index, char * src, const char * tag, const unsigned int matchlast ) {
  42.     char * p = NULL, * q = NULL;

  43.     if( ! * src )
  44.         return( -1 );

  45.     if( ! tag ) { // the last segment
  46.         p = src + strlen( src );
  47.         if( fillsegs( &segs[index], src, p - src ) < 0 ) {
  48.             freesegs( segs, _SEGS );
  49.             return( -1 );
  50.         }

  51.         return( p - src );
  52.     }

  53.     if( ! matchlast ) {
  54.         p = strstr( src, tag );
  55.         if( !p ) {
  56.             freesegs( segs, _SEGS );
  57.             return( -1 );
  58.         }
  59.     } else {
  60.         p = src;
  61.         while( p = strstr( p, tag ) ) {
  62.             q = p;
  63.             p ++;
  64.             if( ! *p ) {
  65.                 freesegs( segs, _SEGS );
  66.                 return( -1 );
  67.             }
  68.         }

  69.         p = q;

  70.         if( !p ) {
  71.             freesegs( segs, _SEGS );
  72.             return( -1 );
  73.         }
  74.     }

  75.     if( fillsegs( &segs[index], src, p - src ) < 0 ) {
  76.         freesegs( segs, _SEGS );
  77.         return( -1 );
  78.     }

  79.     return( p - src );
  80. }

  81. // Output all segs
  82. void printsegs( char ** segs, unsigned int num ) {
  83.     unsigned int i = 0;
  84.     for( ; i < num; i ++ ) {
  85.         printf( "[%s]\t%s\n", segnames[i], segs[i] );
  86.     }

  87.     printf( "\n" );

  88.     return;
  89. }

  90. int ExtractSegs( char * src, char ** segs ) {
  91.     char * p = src;
  92.     int ret = 0;
  93.     unsigned int i = 0;
  94.    
  95.     // Get all segments
  96.     for( ; i < _SEGS; i ++ ) {
  97.         ret = getoneseg( segs, i, p, segseps[i], segmethods[i] );
  98.         if( ret < 0 ) {
  99.             lasterr = i;
  100.             return( ret );
  101.         }
  102.             
  103.         p = p + ret + 1;
  104.     }

  105.     return( 0 );
  106. }

  107. int main( void ) {
  108.     char * file1 = "kevin:pass@127.0.0.1:/var/path/kevin/demo.cpp";
  109.     char * segs[_SEGS] = { 0 };
  110.    
  111.     if( ExtractSegs( file1, segs )  < 0 ) {
  112.         if( lasterr > -1 ) {
  113.             printf( "[ERROR]: %s\n\n", errstrings[lasterr] );
  114.         } else {
  115.             printf( "[ERROR]: Unknown Error!\n\n" );
  116.         }
  117.         
  118.         exit( 1 );
  119.     }

  120.     // Output all segs
  121.     printsegs( segs, _SEGS );

  122.     // Release memories from HEAP
  123.     freesegs( segs, _SEGS );

  124.     return( 0 );
  125. }

复制代码

[ 本帖最后由 xB1ue 于 2007-10-23 12:15 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-10-23 12:15 |只看该作者
char *usr = ""
是不正确的吧。
这样,usr的值不是0,定义一个指针多占用一个字节的空间。

论坛徽章:
0
7 [报告]
发表于 2007-10-23 13:23 |只看该作者
上一个代码写得太麻烦了,修改了


  1. #include <stdio.h>

  2. // Segment numbers
  3. #define _SEGS        5

  4. // Segment names
  5. static const char * segnames[] = { "User", "Pass", "Addr", "Path", "File" };

  6. // Segment separators
  7. static const char * segseps[] = { ":", "@", ":", "/", NULL };

  8. // Segment matching method
  9. static const unsigned int segmethods[] = { 0, 0, 0, 1, 0 };

  10. // Error detail string
  11. static const char * errstrings[] = { "Parse user name error.",
  12.                                      "Parse user pass error.",
  13.                                      "Parse ip address error.",
  14.                                      "Parse file path error.",
  15.                                      "Parse file name error." };

  16. int main( void ) {
  17.     char * file1 = "kevin:pass@127.0.0.1:/var/path/kevin/demo.cpp";
  18.     char * segs[_SEGS] = { 0 };
  19.     char * p = NULL, * q = NULL;
  20.     unsigned int i = 0, j = 0;
  21.    
  22.     p = file1;
  23.     segs[0] = p;
  24.    
  25.     for( ; i < _SEGS; i ++ ) {
  26.         if( segseps[i] ) {
  27.             if( ! segmethods[i] ) {
  28.                 p = strstr( p, segseps[i] );
  29.                 if( !p ) {
  30.                     printf( "[ERROR]: %s\n\n", errstrings[i] );
  31.                     exit( 1 );
  32.                 }
  33.                
  34.                 p ++;
  35.                
  36.                 if( ! *p ) {
  37.                     printf( "[ERROR]: %s\n\n", errstrings[i + 1] );
  38.                     exit( 1 );
  39.                 }
  40.                
  41.                 segs[i + 1] = p;
  42.             } else {
  43.                 while( p = strstr( p, segseps[i] ) ) {
  44.                     q = p;
  45.                     p ++;
  46.                     
  47.                     if( ! *p ) {
  48.                         printf( "[ERROR]: %s\n\n", errstrings[i] );
  49.                         exit( 1 );
  50.                     }
  51.                 }
  52.                
  53.                 p = q;
  54.                 if( !p ) {
  55.                     printf( "[ERROR]: %s\n\n", errstrings[i] );
  56.                     exit( 1 );
  57.                 }
  58.                
  59.                 segs[i + 1] = p;
  60.             }
  61.         } else {
  62.             // the last segment
  63.             segs[i] += 1;
  64.             if( ! * segs[i] ) {
  65.                 printf( "[ERROR]: %s\n\n", errstrings[i] );
  66.                 exit( 1 );
  67.             }
  68.         }
  69.     }
  70.    
  71.     i = 0;
  72.     for( ; i < _SEGS; i ++ ) {
  73.         if( i < ( _SEGS - 1 ) ) {
  74.             j = 0;
  75.             printf( "[%s]\t", segnames[i] );
  76.             for( ; j < ( segs[i + 1] - segs[i] - ( ( segs[i + 1] - segs[i] ) > 1 ? 1 : 0 ) ); j ++ )
  77.                 printf( "%c", * ( segs[i] + j ) );
  78.             printf( "\n" );
  79.         } else {
  80.             printf( "[%s]\t%s\n", segnames[i], segs[i] );
  81.         }
  82.     }
  83.    
  84.     printf( "\n" );
  85.    
  86.     return( 0 );
  87. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2007-10-23 13:28 |只看该作者
用shell写多方便

论坛徽章:
0
9 [报告]
发表于 2007-10-23 17:30 |只看该作者
xB1ue兄 谢谢了
还有ls其他兄弟 学习了
4l说的我脸都红了 要发愤了...

贴个请教别人的code

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

int main()
{
    string str = "kevin:pass@127.0.0.1:/var/path/kevin/demo.cpp";
    char token[4][3] = {":","@",":/"};
    vector<string> sub_str;
    int stpos = 0;
    int endpos = 0;
    int index = 0;
    while(index<3)
    {
    endpos = str.find_first_of(token[index++],stpos);
    sub_str.push_back(str.substr(stpos,endpos-stpos));
    stpos = endpos+1;
    }  
    //最后的"/"比较特殊,做特殊处理

    endpos = str.find_last_of("/",string::npos);
    sub_str.push_back(str.substr(stpos+1,endpos-stpos));
   
    sub_str.push_back(str.substr(endpos+1,str.length()));
    for(vector<string>::iterator it = sub_str.begin();it!=sub_str.end();++it)
    cout<<*it<<endl;
   
    getchar();
    return 0;
}

论坛徽章:
0
10 [报告]
发表于 2007-10-23 18:37 |只看该作者
不推荐使用这个
尽管看起来很简单

const char *s = "usr:pwd@ip:path/file";
char buf[5][10];

sscanf(s, "%[^:]:%[^@]@%[^:]:%[^/]/%s", buf[0], buf[1], buf[2], buf[3], buf[4]);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP