web-dev-qa-db-fra.com

comment initialiser un tableau char?

char * msg = new char[65546];

veulent initialiser à 0 pour chacun d'eux. quelle est la meilleure façon de le faire en C++?

37
5YrsLaterDBA
char * msg = new char[65546]();

Il est connu sous le nom d'initialisation de valeur et a été introduit en C++ 03. S'il vous arrive de vous retrouver pris au piège au cours d'une décennie précédente, vous devrez utiliser std::fill() (ou memset() si vous voulez prétendre que c'est C).

Notez que cela ne fonctionnera pas pour toute valeur autre que zéro. Je pense que C++ 0x offrira un moyen de le faire, mais je suis un peu en retard, donc je ne peux pas en parler.

MISE À JOUR: il semble que mes réflexions sur le passé et l'avenir de la langue ne sont pas entièrement exactes; voir les commentaires pour les corrections.

61
Mike Seymour

La façon "la plus C++" de procéder serait d'utiliser std::fill.

std::fill(msg, msg + 65546, 0);
16
Peter Alexander

En l'absence d'une très bonne raison de faire autrement, j'utiliserais probablement:

std::vector<char> msg(65546, '\0');
15
Jerry Coffin

quelle est la meilleure façon de le faire en C++?

Parce que vous l'avez demandé de cette façon:

std::string msg(65546, 0); // all characters will be set to 0

Ou:

std::vector<char> msg(65546); // all characters will be initialized to 0

Si vous travaillez avec des fonctions C qui acceptent char * ou const char *, vous pouvez faire:

some_c_function(&msg[0]);

Vous pouvez également utiliser la méthode c_str () sur std :: string si elle accepte const char * ou data ().

L'avantage de cette approche est que vous pouvez faire tout ce que vous voulez faire avec un tampon de caractères à allocation dynamique mais de manière plus sûre, flexible et parfois encore plus efficace (en évitant d'avoir à recalculer la longueur de chaîne de manière linéaire, par exemple). Mieux encore, vous n'avez pas à libérer la mémoire allouée manuellement, car le destructeur le fera pour vous.

9
stinky472

Cette méthode utilise la fonction 'C' memset , et est très rapide (évite une boucle char par char).

const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
6
Steve Guidi
memset(msg, 0, 65546)
5
Eric Petroelje

La méthode de type C peut ne pas être aussi attrayante que les autres solutions à cette question, mais ajoutée ici pour être complète:

Vous pouvez initialiser avec des valeurs NULL comme ceci:

char msg[65536] = {0};

Ou pour utiliser des zéros, tenez compte des éléments suivants:

char msg[65536] = {'0' another 65535 of these separated by comma};

Mais ne l'essayez pas comme pas possible , alors utilisez memset!

Dans le second cas, ajoutez ce qui suit après le memset si vous souhaitez utiliser msg ​​ comme chaîne.

msg[65536 - 1] =  '\0'

Les réponses à cette question fournissent également des informations supplémentaires.

1
Laurie Stearn

Vous pouvez utiliser une boucle for. mais n'oubliez pas que le dernier caractère doit être un caractère nul!

char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
    msg[i]='0';
}
msg[65545]='\0';
1
Xpero