C++下操作字符串的超级容易类~~~~~[3]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 lostinet 的 blog

 }

 bool operator == (const char* str)
 {
  return strcmp(pstring,str)==0;
 }
 bool operator == (int n)
 {
  char buf[64];
  sprintf(buf,"%d",n);
  return *this==buf;
 }
 bool operator == (double d)
 {
  char buf[64];
  sprintf(buf,"%g",d);
  return *this==buf;
 }

/****************************************************************/

 operator bool ()
 {
  return length>0?true:false;
 }

 operator const char* ()
 {
  return pstring;
 }
};
template <class t>
jstring& operator + (t t,jstring& js)
{
 return js.convert(t)+js;
}
template <class t>
jstring& operator == (t t,jstring& js)
{
 return js==t;
}

#endif //_lostinet_class_jstring_


#include "iostream.h"
int main(int argc, char* argv[])
{
 //假如在某个地方得到szurl
// const char* szurl="http://www.lostinet.com/some.asp";
// const char* szurl="http://www.lostinet.com/some.asp?id=35&style=1";
 const char* szurl="http://www.lostinet.com/some.asp?id=35&page=3&style=1&page=5";

 //现在目标是解析那段字符串,把page=3中的3取出来,默认为1
 //如果是一般的操作,那么需要很长的代码
 //注意,这个过程没有显式地分配buffer
 //除去注释,不计较szurl,那么一共定义了四个变量
 //其中字符先相关的是 jstring jsurl 和 jstring& jsparams
 //代码共22行(包括3个{和3个})

 int page=1;
 jstring jsurl(szurl);
 //搜索url中?号的地方。如果没有问号,代表没有参数
 int pos=jsurl.indexof("?");
 if(pos>-1)//indexof返回-1代表搜索不到"?",没有参数
 {
  //jstring& jsparams= 是取得新的jstring对象的引用
  //pos+1是为了substr得到的不包括pos所在的"?"
  //jsurl.getlength()是jsurl的长度,substr自动识别长度。取到字符串最后
  //lower()得到小写,非正规写法是strlwr(jsparams.getbuffer());
  jstring& jsparams=jsurl.substr(pos+1,jsurl.getlength()).lower();
  
  //重载了 (bool) 操作符,意思是while(jsparams.getlength()>1)
  while(jsparams)
  {
   //开始寻找"page="的下落
   pos=jsparams.indexof("page=");
   //找不到"page="当然退出了
   if(pos==-1)
    break;
   //0是因为jsparams第一项就是page=....
   //不是0的情况应该继续
   if(pos==0)
   {
    //去掉"page="然后得到后面的数字
    // jstring("3&style=1&page=5") 的.number() 是 3
    page=jsparams.substr(5,jsparams.getlength()).number();
    break;//不break的话,就会继续搜索。在例子中,取得page=5
   }
   //找url参数分割符
   pos=jsparams.indexof("&");
   //如果没有分割符了,代表这次的jsparams是最后一个了。
   if(pos==-1)
    break;
   //"id=35&page=3&style=1&page=5"=>"page=3&style=1&page=5"
   //如此类推
   jsparams=jsparams.substr(pos+1,jsparams.getlength());
  }
 }
 cout<<page;

 //性能参考:
 //例子代码运行后,jstring对象一共分配4个,每个占20byte的内存。jsurl是第一个
 //过程是:
 //1 jstring() : jstring jsurl(szurl);
 //2 substr() : jstring& jsparams=jsurl.substr(pos+1,jsurl.getlength()).lower();
 //3 lower()  : 同上
 //4 substr() : jsparams=jsparams.substr(pos+1,jsparams.getlength());
 //5 substr() : page=jsparams.substr(5,jsparams.getlength()).number();
 //
 //如果把 break;//不break的话,就会继续搜索。在例子中,取得page=5
 //去掉,那么jstring对象一共分配8个。
 //因为多了两次的jsparams=jsparams.substr(pos+1,jsparams.getlength());
 //
 //jstring必须等其链头所在的函数退出,整条链才会释放。
 //如果一个函数长期不退出,不断地计算字符串,
 //那么要确定操作数量不多(10000次的+操作也不算多,100000次就很多了),
 //那才考虑使用jstring
 //

 cout<<"\n\n\n\n";
 return 0;
}

 

 

-----------------------------------------------------------

例子去掉注释后:

#include "iostream.h"
int main(int argc, char* argv[])
{
 const char* szurl="http://www.lostinet.com/some.asp?id=35&page=3&style=1&page=5";

 int page=1;
 jstring jsurl(szurl);
 int pos=jsurl.indexof("?");
 if(pos>-1)
 {

本文关键:string,C++,Lostinet,托管
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top