La question est dans le titre, comment puis-je initialiser un char * [] et lui donner des valeurs en C++, merci.
Bien que vous soyez probablement au courant, char * [] est un tableau de pointeurs vers des caractères, et je suppose que vous souhaitez stocker un certain nombre de chaînes. L'initialisation d'un tableau de tels pointeurs est aussi simple que:
char ** array = new char *[SIZE];
... ou si vous allouez de la mémoire sur la pile:
char * array[SIZE];
Vous voudrez alors probablement remplir le tableau avec une boucle telle que:
for(unsigned int i = 0; i < SIZE; i++){
// str is likely to be an array of characters
array[i] = str;
}
Comme indiqué dans les commentaires de cette réponse, si vous allouez le tableau avec une nouvelle (allocation dynamique), n'oubliez pas de supprimer votre tableau avec:
delete[] array;
Selon ce que vous souhaitez initialiser, vous pouvez effectuer l'une des opérations suivantes:
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};
etc.
Comme ça:
char* my_c_string;
char* x[] = { "hello", "world", 0, my_c_string };
Une chose que j'ai remarqué que vous devez faire attention ... C et C++ ont divergé un peu dans la syntaxe d'initialisation. Comme Mark B. le souligne ci-dessus, vous pouvez ainsi initialiser un tableau de pointeurs char:
const char* messages[] =
{
"Beginning",
"Working",
"Finishing",
"Done"
};
Mais en C++. comme le souligne kriss, cela vous met en garde contre une conversion obsolète de chaîne en char *. C'est parce que C++ suppose que vous voudrez utiliser des chaînes pour les chaînes; -}.
Cela n'est pas toujours vrai. Donc, quand vous voulez vraiment initialiser un tableau de char *, j'ai trouvé que je dois le faire comme ceci:
const char* messages[] =
{
(char*)("Beginning"),
(char*)("Working"),
(char*)("Finishing"),
(char*)("Done")
};
Le compilateur est maintenant content ...
Comme ça:
char p1 = 'A';
char p2 = 'B';
char * t[] = {&p1, &p2};
std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl;
Mais je pense que ce n'est pas la réponse à la vraie question ...
Si vous voulez un tableau de chaînes C défini au moment de la compilation, vous devez utiliser un tableau de const char * à la place:
const char * t2[] = {"string1", "string2"};
std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl;
Sans le const, mon compilateur dirait: avertissement: conversion obsolète de la constante de chaîne en "char *"
Si vous voulez vraiment juste un tableau de style C de chaînes constantes (par exemple des messages indexés):
const char* messages[] =
{
"Beginning",
"Working",
"Finishing",
"Done"
};
Si toutefois vous essayez de conserver un conteneur de chaînes de variables d'exécution, utilisez la fonction C++ std::vector<std::string>
facilitera grandement le suivi de toutes les opérations de mémoire.
std::vector<std::string> strings;
std::string my_string("Hello, world.")
strings.Push_back("String1");
strings.Push_back(my_string);
Comme tout autre tableau:
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;
}