2

C++ で文字列配列の処理に問題があります。以下の 2 つの方法を試しましたが、まだ問題を解決できません。

string* fun(string* a,string*b) 
{
    string c[];
    return c; /* c is string array type*/ 
} 

文字列配列に格納されている最初の文字列を返します c文字列配列全体を返したいです。私が使用したとき:

vector<string> fun(vector<string> a,vector<string> b){
    vector<string> c;
    return c;
}

それでも、いくつかのエラーが発生しました。
どちらの場合も問題がどこにあるかを教えてください。目的の結果を得るために必要な変更.. C++ で文字列配列を処理するにはどうすればよいですか? 事前にサンクス!!

4

5 に答える 5

1

最初のバージョンでは、スコープを離れると存在しなくなるローカル変数 (配列) へのポインターを返します。mallocまたは などを使用して、ヒープ上に配列を作成する必要がありますnew。手動で割り当てた場合は、割り当てを解除することを忘れないでください。

2 番目のバージョンではvector、関数で宣言された のコピーを返します (string返された で sを変更しても、 etではvector変更されません)。空を作成していて、何も追加していないため、何も含まれていません。abvectorstring

于 2012-06-13T05:40:16.137 に答える
1

文字列よりも複雑なオブジェクトを返す必要がある場合は、(コード内で) ベクトルへのリンクを関数に渡し、値を入力する必要があります。それは迅速で正しい方法です。

vector<string> fun(vector<string> a,vector<string> b, vector<string>& result){
  res.push_back("one");
  res.push_back("two");
  res.push_back("three");
}
于 2012-06-13T05:44:47.513 に答える
0

C ++で配列を直接返すことはできません(これはCから継承されます)。それを回避する方法は、それを構造体に詰め込むことです。

struct returned_array
{
    string result[100];
};
returned_array fun()
{
    returned_array result;
    result.result[0] = "whatever";
    return result;
}

例として、任意のサイズ100を選択しました。渡される配列のサイズに基づいて戻りサイズを決定する場合は、テンプレートパラメーターを追加できます。

template<int N>
struct returned_array
{
    string result[N];
};
template<int N>
returned_array<N> fun(string (&)[N])
{
    returned_array<N> result;
    result.result[0] = "whatever";
    return result;
}
于 2012-06-13T06:38:01.473 に答える
0

new最初のスニペットでは、自分でスペースを割り当てるために初期化を試すことができます。

string* func() {
    string* c = new string[3];
    c[0] = "Hello";
    c[1] = "World";
    c[2] = "<3";
    return c;
}

主に:

m = func();
for(int i = 0; i < 3; i++)
{
    cout << m[i] << endl;
}

これにより、関数が終了したときにスコープが失われるのを防ぐことができます。スペースの割り当てを解除することを忘れないでください。配列ではなく、配列へのポインターを返すことに注意してください。また、コードの 2 番目のスニペットを問題なく実行できました。発生しているエラーを常に共有してください。

于 2012-06-13T05:57:02.753 に答える
0

C/C++ では、関数から文字列を返すときにローカル バッファが返されても機能しません。

返されるポインターは、静的バッファー (静的文字列 c[] など) または呼び出し元の関数によって渡されたバッファーへのポインター (string *fun(string *a, string *b, string *c) など) または a へのポインターである必要があります。ローカル配列ではなく、malloc/new を使用して取得したメモリ。

于 2012-06-13T05:59:01.773 に答える