タイトルに質問があります。char*[]を初期化し、C++で値を指定するにはどうすればよいですか。ありがとうございます。
8 に答える
お気づきかもしれませんが、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;
初期化したいものに応じて、次のいずれかを実行できます。
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};
などなど
気をつけなければならないことに気付きました... 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")
};
コンパイラは今幸せです...
このような:
char* my_c_string;
char* x[] = { "hello", "world", 0, my_c_string };
そのように:
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>
定数文字列の 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);
他の配列と同じように:
char *a, *b, *c;
char* cs[] = {a, b, c}; // initialized
cs[0] = b; // assignment
#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;
}