【问题标题】:Append an int to a std::string [duplicate]将 int 附加到 std::string [重复]
【发布时间】:2012-05-17 23:23:27
【问题描述】:

为什么这段代码会给出调试断言失败?

   std::string query;
   int ClientID = 666;
   query = "select logged from login where id = ";
   query.append((char *)ClientID);

【问题讨论】:

  • 您可以添加到 ClientID 的定义中吗?它是 std::string 还是 char * ?
  • 顺便说一下无效的空指针

标签: c++ std


【解决方案1】:

std::string::append() 方法期望其参数是一个以 NULL 结尾的字符串 (char*)。

有几种方法可以生成包含intstring

  • std::ostringstream

    #include <sstream>
    
    std::ostringstream s;
    s << "select logged from login where id = " << ClientID;
    std::string query(s.str());
    
  • std::to_string (C++11)

    std::string query("select logged from login where id = " +
                      std::to_string(ClientID));
    
  • boost::lexical_cast

    #include <boost/lexical_cast.hpp>
    
    std::string query("select logged from login where id = " +
                      boost::lexical_cast<std::string>(ClientID));
    

【讨论】:

  • +1 表示 boost::lexical_cast。
  • +1 表示 std::to_string
  • +1 表示清晰、干净和完整的答案
  • std::to_string 没有需要 int 的函数...
  • 按照标准执行(查看参考链接)。但是,您的编译器可能还没有实现它。
【解决方案2】:

您不能将 int 转换为 char* 来获取字符串。试试这个:

std::ostringstream sstream;
sstream << "select logged from login where id = " << ClientID;
std::string query = sstream.str();

stringstream reference

【讨论】:

  • 哇...我第一次看到 istringstream...谢谢。
  • 抱歉,应该是 ostringstream。固定。
【解决方案3】:

我感觉您的ClientID 不是字符串类型(以零结尾的char*std::string)而是某种整数类型(例如int),因此您需要先将数字转换为字符串:

std::stringstream ss;
ss << ClientID;
query.append(ss.str());

但您也可以使用operator+(而不是append):

query += ss.str();

【讨论】:

    【解决方案4】:

    您将 ClientID 转换为 char* 导致函数假定它是一个空终止的 char 数组,但事实并非如此。

    来自 cplusplus.com:

    字符串& 附加 ( const char * s );附加形成的字符串的副本 由 s 指向的以空字符结尾的字符序列(C 字符串)。这 此字符序列的长度由第一次出现确定 一个空字符(由 traits.length(s) 确定)。

    【讨论】:

    • 好的,我明白了。那么如何在末尾追加一个整数值呢?
    • 请参阅下面的@hmjd 答案.. 他已经涵盖了这个。
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2018-04-25
    • 2023-03-06
    • 2012-06-15
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多