私はC++でCライブラリを使用しており、ラッパーを記述しています。ある時点で私はstd::string
をCスタイルの文字列に変換する必要があります。文字列を返す関数を持つクラスがあります。返された文字列をキャストすることは、文字列が短い場合は機能し、そうでない場合は機能します。ここでは簡単で、問題を示す例を削減:キャストc_str()は短い文字列に対してのみ有効
#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;
}
:
castString:
私はsomeString
にコメントを入れ替える場合のに対し、正しく印刷されます
キャストストリング:hello
これはどのように可能ですか?
ありがとうございました!面白いのは、私の他のシステムで数ヶ月間完全に正常に動作したコードです。 Ubuntuを14.04から15.10にアップデートし、変更されたすべてを再インストールしたばかりです。私はそれが未定義の行動だと思う... – Cat
そして精巧に感謝します。あなたは「良い考えではない」という意味を説明できますか?または、関数から返されたオブジェクトに対してc_str()を呼び出すという私の間違いを指摘していますか? – Cat
私は簡単な修正があると思います: 'std :: cout <<" castString: "<<(const unsigned char *)box.getString().c_str()<< std :: endl;' – chqrlie