【问题标题】:strcat() vs sprintf()strcat() 与 sprintf()
【发布时间】:2009-11-20 18:53:11
【问题描述】:

什么会更快?这个:

sprintf(&str[strlen(str)], "Something");

strcat(str, "Something");

有任何性能差异吗?

【问题讨论】:

  • @Jonathan Feinberg - 这不是 Stack Overflow 的部分意义吗?当然,他可能会进行性能测试,但如果其他人已经做过,为什么要重新发明轮子?
  • 请注意,sprintf 的最佳用途是 sprintf(str, "%s", other_str) ,而不是 sprintf(str, other_str) ,否则您可能会面临格式字符串漏洞的风险

标签: c coding-style


【解决方案1】:

strcat 会更快,因为sprintf 必须首先扫描字符串以查找格式变量。

但真正的胜利在于每个人都知道strcat 在做什么——连接字符串。使用sprintf 进行连接不是标准用法。这会导致人们做出双重考虑。

【讨论】:

    【解决方案2】:

    考虑到两者之间的选择,我会选择strcat;它当然更具可读性,并使您的意图更加清晰。它也可能比sprintf 稍快,但可能不会快很多。

    但是,无论您选择哪种方法,都绝对应该使用snprintfstrncpy 进行缓冲区溢出保护。

    您将此问题标记为cc++;如果您使用 C++,最好使用std::string

    【讨论】:

    • strncpy() 会让你没有终结者。 strlcpy() 或 strlcat() 会更好。
    【解决方案3】:

    如果存在差异,则差异会根据编译器标志、代码运行时的计算机使用情况、库实现...、...

    针对您的具体情况,衡量
    运行这两个 sn-ps 数十亿次并计时。

    我很怀疑你会发现任何显着差异。

    我更喜欢strcat():它清楚地传达了代码的含义。

    【讨论】:

      【解决方案4】:

      我同意其他人的观点:strcat() 应该更快。但是对于“最佳实践”,如果您真的关心速度,则两者都不应该使用。你最好有一个这样的结构:

      typedef struct { size_t len, max; char *str; } mystring_t;
      

      跟踪字符串的结尾。当您附加一个字符串时,只需跳到末尾并复制它。如果分配的内存不够大,则加倍 max。或者,将lenmaxstr 打包在一起可能会让您有点花哨。

      【讨论】:

        【解决方案5】:

        strcat 在这种情况下要快得多。请记住,sprintf() 会逐个字符地解析格式字符串以查找 % 转义。比较一下:

        strcpy (str + strlen (str), "Something");
        

        例如。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-24
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 2021-02-16
          相关资源
          最近更新 更多