2012-05-09 29 views
54

Tại sao mã này cung cấp một Debug Assertion Fail?Nối một int vào một std :: string

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

'ClientID' là gì? – hmjd

+0

bạn có thể thêm vào định nghĩa của ClientID không? nó là một std :: string hoặc char *? – dwalter

+0

xin lỗi, cập nhật ^^ – Hakon89

Trả lời

2

Bạn đang truyền ClientID sang char * khiến chức năng giả định một mảng char không có giá trị mà nó không có.

từ cplusplus.com:

chuỗi & append (const char * s); Gắn thêm một bản sao của chuỗi được tạo thành bằng chuỗi ký tự null (chuỗi C) được trỏ bởi s. Chiều dài của chuỗi ký tự này được xác định bởi ocurrence đầu tiên của một ký tự null (được xác định bởi traits.length (s)).

+0

Ok, tôi hiểu rồi. Vâng làm thế nào có thể nối thêm vào cuối một giá trị số nguyên? – Hakon89

+0

xem @hmjd trả lời xuống dưới đây .. ông đã bao gồm này. – WeaselFox

171

Phương thức std::string::append() mong đợi đối số của nó là chuỗi chấm dứt NULL (char*).

Có một số phương pháp để sản xuất một string có chứa có một int:

  • 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)); 
    
+6

+1 để tăng :: lexical_cast. –

+67

+1 cho tiêu chuẩn :: to_string – luke

+3

+1 cho câu trả lời rõ ràng, rõ ràng và đầy đủ – ervinbosenbacher

5

Bạn không thể cast một int đến một char * để có được một chuỗi. Hãy thử điều này:

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

stringstream reference

+0

Chà ... lần đầu tiên tôi thấy istringstream ... cảm ơn. – Hakon89

+0

Xin lỗi, đó phải là ostringstream. Đã sửa. – luke

2

Tôi có một cảm giác rằng ClientID của bạn không phải là của một loại string (zero-chấm dứt char* hoặc std::string) nhưng một số loại không thể thiếu (ví dụ int), do đó bạn cần phải chuyển đổi số vào chuỗi đầu tiên:

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

Nhưng bạn có thể sử dụng operator+ cũng như (thay vì append):

query += ss.str(); 
Các vấn đề liên quan