1

これは「よくある」質問なので、同様のスレッドを既に確認しましたが、それでも問題は解決しませんでした。

「文字列」を保持するように2次元配列を宣言するにはどうすればよいですか-私は文字の配列の配列が必要です-そしてそれを5つの関数の引数として次々に使用し、参照渡しして内容を動的に更新できるようにします。それを比較します。(10個の「文字列」または空の配列を取得する可能性があるため、動的配列で正しく実行したいので、配列の内容はシステムごとに異なります)。

"string" => C スタイルの文字列、つまり文字の配列。マックスレン < 32;

Cのソリューションはもっと望ましくないでしょうが、ベクトルが機能するのであれば、そうではありません.

4

2 に答える 2

3

C で考えられる 1 つの解決策は次のとおりです。

char **p_strings = calloc(num_strings, sizeof(*p_strings));

for (i = 0; i < num_strings; i++)
{
    // Allocate storage for the i-th string (always leave room for '\0')
    p_strings[i] = calloc(len_string[i]+1, sizeof(*p_strings[i]));
}


...

// Call a function
my_function(p_strings, num_strings);

free使い終わったら、このすべてのデータを覚えておく必要があります。

文字列の長さを変更したり、文字列の数を変更したりする必要がある場合は、かなり面倒な再割り当てを行う必要があります。したがって、C++ で作業している場合は、おそらくstd::vector<std::string>.

std::vector<std::string> strings;

strings.push_back("Foo");
strings.push_back("Bar");

...

my_function(strings);

を使用して、各要素の C スタイル文字列への const ポインターを取得することもできますc_str()

于 2011-08-25T13:36:39.677 に答える
2

C++ を想定しています。このため、ベクトルを文字列に使用しても問題はありません (文字列は 2 番目の次元として機能します)。

void foo(vector<string> v) {
    cout << v[0]; // Assuming the elements exist!
}

int main(int argc, char *argv[])
{
    vector<string> vString; // Make the vector

    vString.push_back("something"); // Add a string

    foo(vString); // Print out 'something'
}

あなたの編集では、変更されるのは実際の文字列だけであることも説明したので、push_back必要なときに文字列を ing する代わりに、ベクトルを長さで初期化できます。

vector<string> vString(10); // Assuming a size of 10

そして、それらを通常どおり使用します。

vString[4] = "something";

そして(コメントに応じて)実行時にサイズを変更するには:

vString.resize(15); // Make it bigger, generates new blank strings
于 2011-08-25T13:41:25.693 に答える