16

ライブラリにchar*、データを取り込んで変更する関数があります。

私はそれを与えようとしましたc_str()が、C ++ドキュメントはそれが返すと言っていますconst char*.

char 配列を新規作成してそれにコピーする以外に何ができますか?

4

5 に答える 5

17

次の限り、&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.

于 2012-06-06T15:01:44.107 に答える
11

何もない。

はその内容を自身で管理するため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]);
于 2012-06-06T14:57:59.877 に答える
3

関数がそれ以上変更されないことがわかっている場合は、次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で保証されていますが、ロープの実装(つまり、非連続メモリ)が許可されていた以前のバージョンの標準では保証されていません。

于 2012-06-06T15:02:43.923 に答える
2

実装が文字列の長さを増やそうとしない場合:

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]);
于 2012-06-06T15:07:06.560 に答える
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++での一時的な保証された存続期間?

于 2012-06-06T15:11:30.550 に答える