IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

重构发现:指针操作问题

C++博客-梁兄 2009-11-02 21:05:07 累计浏览 3,563 次
本机暂存

原来版本:

以下是代码片段:
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. 美团 BI 在指标平台和分析引擎上的探索和实践 (2026-06-15 09:05:33)
  2. 把 Next.js 拆成壳:LobeHub 后端迁移 Hono 实录 (2026-06-10 19:27:40)
  3. 把 MinIO 示例迁到 OtterIO:使用、部署与迁移验证 (2026-06-09 22:34:00)

查看更多 后端 文章 →

建议继续学习

  1. 为什么优秀的程序员既懒又笨 (累计阅读 4,958)
  2. string替换所有指定字符串(C++) (累计阅读 4,265)
  3. 腾讯php程序员面试题目答案――编程任务 (累计阅读 4,037)
  4. 实践中的重构 (累计阅读 3,943)
  5. Java将Object对象转换为String的总结合集 (累计阅读 3,781)
  6. PHP截取汉字出现乱码的解决方法 (累计阅读 3,722)
  7. 倒置字符串中的单词 (累计阅读 3,561)
  8. javascript正则表达式教程 (累计阅读 3,400)
  9. 从 if else 到 switch case 再到抽象 (累计阅读 3,354)
  10. 页面模块化(设想) (累计阅读 3,304)