【问题标题】:How to efficiently create const c string from string literal and appended int or long value如何从字符串文字和附加的 int 或 long 值有效地创建 const c 字符串
【发布时间】:2019-12-05 07:57:30
【问题描述】:

在 c++ 中,如何根据文字和附加的 long/int 值有效地创建 c 字符串?从逻辑上讲,我想做这样的事情:

const char *sql = "select * from MyTable where ID = " + longId;

longId 是一个 int/long 参数。

【问题讨论】:

  • 使用std::string 来完成组装工作,就像你展示的那样,但是输入std::to_stringlongId 转换为string,然后将cstring 取出使用c_str 方法组装的string。打开优化,编译器应该会处理剩下的事情。
  • 视情况而定。字符串sql 是仅在创建它的上下文中使用,还是会从函数返回并由该函数的调用者使用?如果是后者,您需要仔细管理字符串的生命周期——既要确保它在需要时存在,又要避免内存泄漏。通常最好将字符串作为std::string 组装和使用,因为这样它可以(与C 字符串不同)通过值安全地传递,通过引用传递(当它存在时)并且不会引入内存泄漏. const c 字符串也可以很容易地从 std::string 获得。
  • 仅在函数内部——这在单个函数中是短暂的,它从只有 C 接口的 SQLite 数据库执行 DB 检索。
  • Sql库一般会提供bind的方法来避免exploit手动串接。
  • @Jarod42 是的,谢谢我知道,但是,我现在只专注于 c 和 c++ 字符串机制,并试图学习这一点——对于这个基本的东西似乎没有立即明确的答案确实有很多东西要学!

标签: c++ string int append


【解决方案1】:

这会从 user4581301 评论中编译一个答案,如果 user4581301 自己回答并要求我这样做,我会提出删除。
根据 user4581301 的建议,您可以这样做:

std::string s = "select * from MyTable where ID = " + std::to_string(longId);

您可以使用 s.c_str() 获得等价的 C 字符串,例如:

std::cout << s.c_str() << std::endl;

【讨论】:

  • 打开游戏。我没有正式回答,因为这个问题有点开放式。就性能而言,这可能不是最有效的解决方案,但它是编写效率最高的解决方案,并且它与更快的解决方案之间的性能差异几乎肯定会在可能会遵循的 SQL 查询成本中丢失。
  • 多亏了你们两个,我遇到了一个不知道如何准确地提出问题的情况,因为我什么都不知道:-)。我正在尝试编写一个独立的 C++ 函数,该函数又调用 C lib 进行数据库查找。我想向作为我的 SQL 语句(包括数字参数)的 C 库提供一个 char*。我对纳秒计时和编译器优化竞赛完全不感兴趣,这只是基于尝试为下游 C lib 提供一个 char* 以进行一次性函数调用。
【解决方案2】:

我认为 H.S. 的答案。鉴于所提出的问题,这是完美的。仅供参考,因为我使用的是 Qt(我在 OP 中没有提到),所以我最终使用了这段代码:

QString sql = QStringLiteral("SELECT v.drive_path_if_builtin, "
                                    "m.full_filepath "
                             "FROM media_table m "
                             "INNER JOIN volume_table v "
                                     "ON (v.id = m.volume_id) "
                             "WHERE m.id = %1;").arg(id);

...然后在需要 c 字符串的适当位置,我使用了qPrintable(sql)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2015-04-22
    • 2021-03-08
    • 2020-11-18
    • 2021-10-25
    相关资源
    最近更新 更多