2012-06-22 28 views
6

Tôi đang cố gắng sử dụng std :: ostringstream để chuyển đổi một số thành một chuỗi (char *), nhưng nó dường như không được làm việc. Đây là mã tôi có:std :: ostringstream không trả lại một chuỗi giá trị

#include <windows.h> 
#include <sstream> 

int main() 
{ 
    std::ostringstream out; 
    out << 1234; 

    const char *intString = out.str().c_str(); 

    MessageBox(NULL, intString, intString, MB_OK|MB_ICONEXCLAMATION); 

    return 0; 
} 

Hộp thư kết quả không có văn bản trong đó.

Điều này dẫn tôi để tin rằng cuộc gọi đến out.str().c_str() được trả lại một chuỗi không hợp lệ, nhưng tôi không chắc chắn. Kể từ khi tôi đã cắt chương trình này xuống cho đến nay một sáng vẫn nhận được vấn đề, tôi phải đã thực hiện một sai lầm đáng xấu hổ đơn giản. Trợ giúp được đánh giá cao!

+0

+1 cho, câu hỏi ngắn gọn rõ ràng bao gồm một SSCCE. Tôi nhận được văn bản thích hợp trong cửa sổ 7 với GCC 4.7.1, mặc dù. – chris

+4

@chris: Hành vi không xác định là không xác định. ; -] – ildjarn

+0

@ildjarn, Ah, bắt tốt. – chris

Trả lời

12

out.str() trả về một std::stringtheo giá trị, có nghĩa là bạn đang gọi số .c_str() tạm thời. Do đó, vào thời điểm intString được khởi tạo, nó đã trỏ vào dữ liệu không hợp lệ (bị hủy).

cache kết quả của .str() và làm việc với điều đó:

std::string const& str = out.str(); 
char const* intString = str.c_str(); 
+2

Các 'const &' trông hùng mạnh awkard. Tại sao không chỉ 'const std :: string mystring (out.str());'? – rubenvb

+1

@rubenvb: Bạn thấy điều gì là khác biệt? – ildjarn

+0

Xin chào ildjarn. Tôi đoán @rubenvb có nghĩa là: Khi một nhà phát triển lần đọc 'const std :: string str (out.str()); 'ông ngay lập tức hiểu rằng' str' là một bản sao. Nhưng 'const std :: string & str = out.str();' cho ấn tượng 'str' chỉ là một tham chiếu đến một 'chuỗi' xử lý bởi một biến khác. Trường hợp thứ hai có thể gây nhầm lẫn, phải không? – olibre

Các vấn đề liên quan