0

char** を使用して n 個の文字列の配列を作成するにはどうすればよいですか?

char** lit;
*lit = (char*)calloc(this->nr_param, sizeof(char*));
for(int i = 0; i < this->nr_param; i++)
      lit[i] = (char*) calloc(this->nr_param, sizeof(char));    

これが道ですか?もしそうなら、どうすれば要素にアクセスできますか? 私の配列に次の要素が含まれるとしましょう: aaab、abba、baab;

私はこの構造が欲しい:

lit[0] = "aaab";
lit[1] = "abba";
lit[2] = "baab"; 

どうやって宣言したの?

4

2 に答える 2

8

このような:

// allocate memory for n char pointers dynamically.
char ** lit = static_cast<char**>(::operator new(n * sizeof(char*)));

for (unsigned int i = 0; i != n; ++i)
{
    lit[i] = static_cast<char*>(::operator new(length_of_string_i)); // #1
    // populate lit[i] with data
}

i#1 とマークされた行に適切に貼り付ける必要がある th 文字列の長さを決定する何らかの方法が必要です。に注意してください。そのsizeof(char) == 1ため、内部割り当てで何も乗算する必要はありません。(必要に応じてstd::mallocの代わりに使用できますが、使用する必要があります。) 完了したら、クリーンアップすることを忘れないでください。::operator new#include <cstdlib>

もちろん、これはあなたが求めたものの文字通りの翻訳に過ぎません。C++ では、通常、生のメモリ割り当てよりもオブジェクトの作成を優先します。これは次のようになります。

// construct n char pointers dynamically
char ** lit = new char*[n];

for (unsigned int i = 0; i != n; ++i)
{
    lit[i] = new char[length_of_string_i];
    // populate lit[i] with data
}

ただし、array-new は絶対に使用しないでください。これは良いコンセプトではなく、良い C++ となることはめったにありません。

したがって、これをまったく行うべきではなく、代わりに次を使用する必要があります。

std::vector<std::string> lit(n);
于 2012-03-10T10:44:59.983 に答える
2

同様の方法で c++ ベクトルと文字列を使用できます。

  #include <vector>
  #include <string>
  #include <iostream>
  int main() {
    std::vector<std::string> lit;
    lit.push_back("aaab");
    lit.push_back("aab");
    lit.push_back("aabb");
    lit[0][0] = 'z';
    std::cout << lit[0] << std::endl;
  }
于 2012-03-10T10:48:29.577 に答える