web-dev-qa-db-ja.com

Char * []の初期化

質問はタイトルにあります。どうすればchar * []を初期化し、C++で値を与えることができますか、ありがとう。

25
DogDog

おそらくご存知でしょうが、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;
19
Stephen Cross

初期化する対象に応じて、次のいずれかを実行できます。

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};

などなど.

11
John Weldon

このような:

char* my_c_string;
char* x[] = { "hello", "world", 0, my_c_string };
7
Max Shawabkeh

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

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

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

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

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

コンパイラーは幸せになりました...

7
Don Doerner

そのように:

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 *」への非推奨の変換

2
kriss

定数文字列の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);
2
Mark B

他の配列と同じように:

char *a, *b, *c;
char* cs[] = {a, b, c}; // initialized
cs[0] = b; // assignment
1
Peter Alexander
#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;
}
1
xian