技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> 重构发现:指针操作问题

重构发现:指针操作问题

浏览:2389次  出处信息

原来版本:

以下是代码片段:
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
}

建议继续学习:

  1. Linus:利用二级指针删除单向链表    (阅读:11335)
  2. C语言结构体里的成员数组和指针    (阅读:4818)
  3. 抵制代码重写    (阅读:4245)
  4. 如何避免重构带来的危险    (阅读:3702)
  5. 什么是重构,什么不是重构    (阅读:3481)
  6. 通过引用计数解决野指针的问题(C&C++)    (阅读:3404)
  7. 前端重构实践(一) —— 性能优化    (阅读:3171)
  8. C 语言中统一的函数指针    (阅读:3024)
  9. 实践中的重构    (阅读:3035)
  10. cpp智能指针的简单实现    (阅读:3073)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1