ライブラリにchar*
、データを取り込んで変更する関数があります。
私はそれを与えようとしましたc_str()
が、C ++ドキュメントはそれが返すと言っていますconst char*
.
char 配列を新規作成してそれにコピーする以外に何ができますか?
ライブラリにchar*
、データを取り込んで変更する関数があります。
私はそれを与えようとしましたc_str()
が、C ++ドキュメントはそれが返すと言っていますconst char*
.
char 配列を新規作成してそれにコピーする以外に何ができますか?
次の限り、&str[0]
またはを使用できます。&*str.begin()
resize()
。str.size()
の引数として渡す必要があります)。\0
関数が戻るとき、見つけた最初の文字で文字列を明示的にトリミングします。そうしないstr.size()
と、「論理」文字列サイズではなく「事前割り当てサイズ」が返されます。注意:これは C++11 (文字列が連続していることが保証されている) で動作することが保証されていますが、標準の以前のリビジョンでは動作しません。std::basic_string
それでも、私が知っている標準ライブラリの実装で、非連続ストレージを実装したものはありません
それでも、安全を確保したい場合は、std::vector<char>
(C++03 以降、連続性が保証されています); を使用してください。好きなように初期化し(2つのイテレータを取り、最後にnull文字を追加するコンストラクタを使用して文字列からデータをコピーできます)、サイズを変更して、最初の文字std::string
で停止する文字列にコピーして戻します\0
.
何もない。
はその内容を自身で管理するためstd::string
、文字列の基になるデータへの書き込みアクセスはできません。それは未定義の動作です。
ただし、char 配列の作成とコピーは難しくありません。
std::string original("text");
std::vector<char> char_array(original.begin(), original.end());
char_array.push_back(0);
some_function(&char_array[0]);
関数がそれ以上変更されないことがわかっている場合は、次str.size()
のいずれかの方法でポインターを取得できます。
void f( char* p, size_t s ); // update s characters in p
int main() {
std::string s=...;
f( &s[0], s.size() );
f( &s.front(), s.size() );
}
これはC++11で保証されていますが、ロープの実装(つまり、非連続メモリ)が許可されていた以前のバージョンの標準では保証されていません。
実装が文字列の長さを増やそうとしない場合:
C++11:
std::string data = "This is my string.";
func(&*data.begin());
C++03:
std::string data = "This is my string.";
std::vector<char> arr(data.begin(), data.end());
func(&arr[0]);
これは、一時バッファを生成し、破棄されたときに文字列に自動的にコピーするクラスです。
class StringBuffer
{
public:
StringBuffer(std::string & str) : m_str(str)
{
m_buffer.push_back(0);
}
~StringBuffer()
{
m_str = &m_buffer[0];
}
char * Size(int maxlength)
{
m_buffer.resize(maxlength + 1, 0);
return &m_buffer[0];
}
private:
std::string & m_str;
std::vector<char> m_buffer;
};
そして、これがあなたがそれをどのように使うかです:
// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);
std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
このコードを以前に見たことがあると思われる場合は、私が書いた質問からコピーしたためです。C++での一時的な保証された存続期間?