30

タイトルに質問があります。char*[]を初期化し、C++で値を指定するにはどうすればよいですか。ありがとうございます。

4

8 に答える 8

21

お気づきかもしれませんが、char*[] は文字へのポインターの配列であり、多数の文字列を格納する必要があると思います。このようなポインターの配列の初期化は、次のように簡単です。

char ** array = new char *[SIZE];

...または、スタックにメモリを割り当てている場合:

char * array[SIZE];

次に、おそらく次のようなループで配列を埋めたいと思うでしょう:

for(unsigned int i = 0; i < SIZE; i++){
    // str is likely to be an array of characters
    array[i] = str;
}

この回答のコメントに記載されているように、新しい (動的割り当て) で配列を割り当てる場合は、次の方法で配列を削除することを忘れないでください。

delete[] array;
于 2010-02-10T20:30:47.230 に答える
13

初期化したいものに応じて、次のいずれかを実行できます。

char mystr[] = {'h','i',0};
char * myotherstring = "my other string";
char * mythirdstring = "goodbye";

char * myarr[] = {0};
char * myarr[] = {&mystr, myotherstring};
char * myarr[10];
char * myarr[10] = {0};
char * myarr[10] = {&mystr, myotherstring, mythirdstring, 0};

などなど

于 2010-02-10T20:30:29.213 に答える
10

気をつけなければならないことに気付きました... C と C++ では、初期化構文が少し異なります。Mark B. が上で指摘したように、char ポインターの配列を次のように初期化できます。

const char* messages[] =
{
    "Beginning",
    "Working",
    "Finishing",
    "Done"
};

ただし、C++ では。kriss が指摘しているように、これにより、string から char* への非推奨の変換に関する警告が表示されます。これは、C++ が、文字列に文字列を使用する必要があると想定しているためです ;-}。

それは必ずしも真実ではありません。したがって、本当に char* の配列を初期化したい場合は、次のようにする必要があることがわかりました。

const char* messages[] =
{
    (char*)("Beginning"),
    (char*)("Working"),
    (char*)("Finishing"),
    (char*)("Done")
};

コンパイラは今幸せです...

于 2013-01-23T00:07:22.950 に答える
7

このような:

char* my_c_string;
char* x[] = { "hello", "world", 0, my_c_string };
于 2010-02-10T20:31:17.867 に答える
2

そのように:

char p1 = 'A';
char p2 = 'B';
char * t[] = {&p1, &p2};

std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl;

しかし、どういうわけか、それは本当の質問に対する答えではないと思います...

コンパイル時に定義された C 文字列の配列が必要な場合は、代わりに const char * の配列を使用する必要があります。

const char * t2[] = {"string1", "string2"};

std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl;

const がないと、コンパイラは次のように言うでしょう: 警告: 文字列定数から 'char*' への非推奨の変換</p>

于 2010-02-10T20:38:33.173 に答える
2

定数文字列の C スタイルの配列が本当に必要な場合 (たとえば、インデックス付きメッセージ):

const char* messages[] =
{
    "Beginning",
    "Working",
    "Finishing",
    "Done"
};

ただし、ランタイム変数文字列のコンテナーを維持しようとしている場合は、C++ 機能std::vector<std::string>を使用すると、すべてのメモリ操作を簡単に追跡できます。

std::vector<std::string> strings;
std::string my_string("Hello, world.")
strings.push_back("String1");
strings.push_back(my_string);
于 2010-02-10T20:38:49.960 に答える
1

他の配列と同じように:

char *a, *b, *c;
char* cs[] = {a, b, c}; // initialized
cs[0] = b; // assignment
于 2010-02-10T20:30:01.587 に答える
1
#include <iostream>

int main(int argc, char *argv[])
{
    char **strings = new char *[2]; // create an array of two character pointers
    strings[0] = "hello"; // set the first pointer in the array to "hello"
    strings[1] = "world"; // set the second pointer in the array to "world"

    // loop through the array and print whatever it points to out with a space
    // after it
    for (int i = 0; i < 2; ++i) {
        std::cout << strings[i] << " ";
    }

    std::cout << std::endl;

    return 0;
}
于 2010-02-10T20:38:12.817 に答える