Récemment, je veux convertir Vector sur Char * Array [].
Alors j'avais trouvé la solution. Mais ce n'était pas de la sécurité .. p>
Voici mon code P>
char** arr = new char* [4];
vector<string> vv;
// setting strings
for (int i = 0 ;i < 4; i++)
{
vv.emplace_back("hello world");
}
// convert
for (int i = 0; i < 4; i++)
{
arr[i] = new char[vv[i].size()];
memcpy(arr[i], vv[i].c_str(), vv[i].size());
}
// prints
for (int i = 0; i < 4; i++)
{
cout << arr[i] << endl;
}
// output
// hello world羲羲?ìì¨
// hello world羲羲æì½ì¨
// hello world羲羲
// hello world羲羲?íºì¨
// delete memorys
for (unsigned index = 0; index < 4; ++index) {
delete[] arr[index];
}
delete []arr;
3 Réponses :
Lorsque vous utilisez provoque un comportement indéfini. P> Vous avez besoin d'un couple de mineur changements. p> memcpy code>, arr [i] code> n'est pas garanti d'être une chaîne terminée null. Traiter arr [i] code> comme chaîne terminée null, comme dans
Strcpy code> au lieu de memcpy code>. li>
OL> arr[i] = new char[vv[i].size() + 1];
strcpy(arr[i], vv[i].c_str());
Mais Erreur Visual Studio: "Cette fonction peut être dangereuse", donc il vous recommande d'utiliser Strcpy_s ...
@Teom, bien sûr, vous pouvez utiliser cela ou strncpy code>.
Pour être honnête, même Memcpy fonctionnerait si vous vous souvenez que C Strings sont toujours nuls terminés . Il vous suffit d'allouer la taille + 1 et de la copie + 1.
@ Maciejzałucki, accepté. C'est aussi une autre option.
Il y a un moyen plus facile de le faire si vous pouvez maintenir la durée de vie de votre «code> vecteur code> code>. De cette façon, vous n'allouez pas de mémoire supplémentaire, Toutefois, vous devez garder à l'esprit qu'une fois votre référence initiale code> code> est détruite, ce tableau sera également corrompu. Mais si vous avez besoin d'une telle conversion pour un simple appel d'une API synchrone dans le même fil, cela ferait le tour. P> P>
Si je peux le faire, je ne demanderai pas quelque chose
Tant que le vecteur et les cordes à l'intérieur ne changeront jamais. Même si vous gardez la durée de vie de ce vecteur, toute modification apportée peut déclencher la réaffectation.
Dans de tels cas, j'utilise habituellement cette construction laid.
arr[i] = new char[vv[i].size() + 1]; arr[i][vv[i].copy(arr[i], vv[i].size())] = 0;
Lors de l'impression de chaîne pointée par un bouton
Const de caractères * code>, la chaîne doit être terminée null afin que le programme connaisse la longueur de la chaîne. La taille renvoyée parstd :: string :: Taille code> n'inclut pas le caractère null, c'est donc la raison des caractères inattendus. Vous devez allouer un autre caractère et la définir à NULL pour chaque tableau pointé parchar * code>.@paxhun Si la taille du vecteur est de 11 et que la capacité est de 14. Vous pouvez donc dire que 3 caractères nuls ont été inclus. À droite?
Si la taille du vecteur est 11, cela signifie qu'il y a 11 chaînes, vous devez donc mettre 11 caractères nuls supplémentaires. La capacité du vecteur n'a pas d'importance ici.