Tôi đang sử dụng thư viện C trong C++ và đã viết một trình bao bọc. Tại một thời điểm tôi cần phải chuyển đổi một std::string
thành một chuỗi kiểu c. Có một lớp với một hàm, trả về một chuỗi. Việc đưa chuỗi trả về hoạt động nếu chuỗi ngắn, nếu không thì sẽ không. Dưới đây là một ví dụ đơn giản và giảm minh họa vấn đề này:Đúc c_str() chỉ hoạt động đối với các chuỗi ngắn
#include <iostream>
#include <string>
class StringBox {
public:
std::string getString() const { return text_; }
StringBox(std::string text) : text_(text){};
private:
std::string text_;
};
int main(int argc, char **argv) {
const unsigned char *castString = NULL;
std::string someString = "I am a loooooooooooooooooong string"; // Won't work
// std::string someString = "hello"; // This one works
StringBox box(someString);
castString = (const unsigned char *)box.getString().c_str();
std::cout << "castString: " << castString << std::endl;
return 0;
}
Thực thi các tập tin trên bản in này ra cửa sổ Console:
castString:
trong khi nếu tôi trao đổi các ý kiến về someString
, nó in chính xác
castString: hello
Làm cách nào có thể?
Cảm ơn, điều đó có ý nghĩa! Điều thú vị là mã hoạt động hoàn toàn tốt đẹp trong nhiều tháng trên hệ thống khác của tôi. Chỉ bây giờ tôi đã cập nhật Ubuntu từ 14.04 đến 15.10 và cài đặt lại mọi thứ đã thay đổi. Tôi đoán đó là hành vi không xác định ... – Cat
Và cảm ơn bạn đã xây dựng. Bạn có thể giải thích ý của bạn bằng cách "không phải là một ý tưởng hay" không? Hoặc là bạn đề cập đến sai lầm của tôi gọi c_str() trên một đối tượng trả về bởi một chức năng? – Cat
Tôi đoán sửa chữa dễ dàng là: 'std :: cout <<" castString: "<< (const unsigned char *) box.getString(). C_str() << std :: endl;' – chqrlie