2

我々は持っています:

 std::string string_array[2];

 string_array[0] = "some data";

 string_array[1] = "some more data";

 char* cstring_array[2];

string_array から cstring_array にデータをコピーする最も効率的な方法は何ですか? または string_array を関数に渡します。" const char* cstring_array[]" が必要ですか?

4

6 に答える 6

12

を受け取る関数は、char const *文字列の配列ではなく、一度に 1 つの文字列を受け入れるように書かれています。このような関数に を渡すにはstd::string、関数をyour_string.c_str()パラメーターとして呼び出すだけです。

編集:文字列の配列を取る関数の場合、(少なくとも私にとって)明らかな選択は、次を渡すことができる最小限のフロントエンドを作成することですvector<std::string>

// The pre-existing function we want to call.
void func(char const *strings[], size_t num) { 
    for (size_t i=0;i<num; i++)
        std::cout << strings[i] << "\n";
}

// our overload that takes a vector<string>:
void func(std::vector<std::string> const &strings) { 
    std::vector<char const *> proxies(strings.size());

    for (int i=0; i<proxies.size(); i++)
        proxies[i] = strings[i].c_str();
    func(&proxies[0], proxies.size());
}
于 2010-07-08T19:57:23.677 に答える
4

string::c_strchar への const ポインターを取得するために使用します。

于 2010-07-08T19:56:31.963 に答える
3

単純に使用します:
string_array[0].c_str()
string_array[1].c_str()

c_str()を参照してください。

const charT* c_str() const basic_string 文字列の内容を表すヌル終了文字配列へのポインタを返します。

于 2010-07-08T19:56:27.540 に答える
1

string_array[1].c_str() を文字列が必要な関数に渡すことで、c-string バージョンにアクセスできます。

ただし、返されるポインタは stl::string に依存することに注意してください! ポインターを取得してから文字列を解放すると、無効なポインターが作成されます

于 2010-07-08T19:58:22.980 に答える
0

アレイに問題があるようです。ブライアンが指摘したように、配列インデックスは1ではなく0から始まります。したがって、2つはとであり、とでstringsはありませんstring_array[0]string_array[1] string_array[1]string_array[2]

また、関数がパラメーターconst char* cstring_arrayを受け取る場合、変数char* cstring_array[2]はおそらくあなたが望むものではありません。そのまま渡す場合は、配列の名前が最初の要素へのポインタと同等であると見なすことができるため、基本的にはchar**ではなく、を渡すことになります。char*

質問を提示したので、次のようなことを行うことができます(インデックス作成エラーを修正し、言及した関数が呼び出されると仮定しますmyFunction)。

...
cstring_array[0] = string_array[0].c_str( );
cstring_array[1] = string_array[1].c_str( );

myFunction (cstring_array[0]);
myFunction (cstring_array[1]);
...

ただし、まったく必要としない、より単純な同等のものcstring_arrayは次のとおりです。

...
myFunction (string_array[0].c_str( ));
myFunction (string_array[1].c_str( ));
...

または、両方の文字列を含む単一のchar配列を渡すことを意図している場合(これは、質問の私の解釈からの可能性です)、本当にやりたいことは、元の文字列を連結した単一の文字列を生成することです。 2:

...
std::string str = string_array[0] + string_array[1];

myFunction (str.c_str( ));
...

お役に立てば幸いです。

編集:私がこれを書いた後に現れたコメントを考えると、最初の例はあなたが必要としているものに近いと思います。次のようにします(Nはいずれかの配列のエントリ数です)。

...
for (int i = 0; i < N; i++)
    cstring_array[i] = string_array[i].c_str( );

myFunction (cstring_array);
...

これが可能な唯一のアプローチです。stringの配列が与えられると、の配列を与える標準関数(AFAIK)はありませんchar*。その理由は次のとおりだと思います。-頻繁に行う必要のあることではないため、このような機能を広く利用できるようにする必要はほとんどありません。-そのような機能があったとしたら、とにかく上記と非常によく似ているでしょう。その場合、それは非常に些細なことで不要です。

基本的に、あなたの質問に答えるために、これ以上効率的な方法はないと思います。これを行うための標準ライブラリ関数があったとしても、とにかくこのアプローチを使用します。

于 2010-07-08T20:21:29.093 に答える
0

本当に2つの異なる質問です。関数に渡すには、単に を呼び出しますc_str()。コピーするには、単純に呼び出しstrncpy()て、関数への受け渡しについて述べたことを思い出してください。

std::string には、実際に終了せずに '\0' を含めることができることに注意してください。このような状況では、文字列の一部しか取得できません。そのようなデータをコピーしようとしている場合は、memcpy()代わりに使用する必要があります。

于 2010-07-08T20:02:55.783 に答える