0
votes

Comment puis-je convertir Vector en Char * Arr []?

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 commentaires

Lors de l'impression de chaîne pointée par un bouton Const de caractères * , la chaîne doit être terminée null afin que le programme connaisse la longueur de la chaîne. La taille renvoyée par std :: string :: Taille 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é par char * .


@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.


3 Réponses :


1
votes

Lorsque vous utilisez 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 xxx pré>

provoque un comportement indéfini. P>


Vous avez besoin d'un couple de mineur changements. p>

  1. allouer un autre octet de mémoire. li>
  2. Utilisez Strcpy code> au lieu de memcpy code>. li> OL>
    arr[i] = new char[vv[i].size() + 1];
    strcpy(arr[i], vv[i].c_str());
    


4 commentaires

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 .


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.



0
votes

Il y a un moyen plus facile de le faire si vous pouvez maintenir la durée de vie de votre «code> vecteur . xxx

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 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.


2 commentaires

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.



0
votes

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;


0 commentaires