}
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)
{