bool GetCookieUseName(const string& cookie_data, string& usename,
const char * falg, const char endfalg)
{
char * p = strstr(cookie_data.c_str(), falg);
if (p != NULL)
{
p += strlen(falg);
for( ; *p != endfalg; p++)
{
usename += *p;
}
return true;
}
else
usename="";
return false;
}
void Test( )
{
string cookie( "name=aaaxx%" );
string usename;
GetCookieUseName( cookie, usename, "name=", ';' );
cout << usename.c_str( ) << endl;
}
点评:1. 严重的崩溃:没有检查p指向结束符,一旦cookie_data里有falg但没有endfalg,程序就一直for下去到崩溃。
解决:*p && *p != endfalg
2. 性能低下:usename += *p; 每个字符都调用一次basic_string& operator+=(E c),作为一个工具类函数,要考虑效率。
解决:应该是找到最后一个后,得到其长度,然后一次性调用basic_string& append(const E *s, size_type n);
3. 逻辑错误:如果只做第一点修改,程序虽然不崩溃了,但会把falg之后所有字符当作usename, 没有endfalg应该是找不到合法的usename.
4. 代码组织差:头重脚轻型
简单改进版本:
bool GetCookieUseName(const string& cookie_data, string& usename,
const char * falg, const char endfalg)
{
char * p = strstr(cookie_data.c_str(), falg);
if (NULL == p)
{
usename="";
return false; // not found begin tag
}
p += strlen(falg);
char * q = p;
for ( ; *q && *q != endfalg; q++)
{}
if (*q == endfalg)
{
if (q == p)
{
usename="";
}
else
{
usename.append( p, q - p );
}
return true;
}
usename="";
return false; // not found end tag
}