43 votes

Copie d'un tableau de caractères non terminés par des zéros vers std::string

Si le tableau était Terminaison nulle ce serait assez simple :

unsigned char u_array[4] = { 'a', 's', 'd', '\0' };
std::string str = reinterpret_cast<char*>(u_array);
std::cout << "-> " << str << std::endl;

Cependant, je me demande quelle est la manière la plus appropriée de copier une non terminées par un zéro tableau de caractères non signés, comme le suivant :

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

en un std::string .

Existe-t-il un moyen de le faire sans itérer sur le fichier tableau de caractères non signés ?

Merci à tous.

57voto

Charles Bailey Points 244082

std::string a un Constructeur qui prend une paire d'itérateurs et unsigned char peut être converti (d'une manière définie par l'implémentation) en char donc ça marche. Il n'y a pas besoin d'un reinterpret_cast .

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

#include <string>
#include <iostream>
#include <ostream>

int main()
{
    std::string str( u_array, u_array + sizeof u_array / sizeof u_array[0] );
    std::cout << str << std::endl;
    return 0;
}

Bien sûr, une fonction de modèle "taille du tableau" est plus robuste que la fonction sizeof calcul.

23voto

karlphillip Points 46502

Eh bien, apparemment std::string a un Constructeur qui pourrait être utilisé dans ce cas :

std::string str(reinterpret_cast<char*>(u_array), 4);

6voto

Lors de la construction d'une chaîne sans spécifier sa taille, le constructeur va itérer sur un tableau de caractères et chercher le terminateur nul, qui est '\0' caractère. Si vous n'avez pas ce caractère, vous devez spécifier la longueur explicitement, par exemple :

// --*-- C++ --*--

#include <string>
#include <iostream>

int
main ()
{
    unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
    std::string str (reinterpret_cast<const char *> (u_array),
                     sizeof (u_array) / sizeof (u_array[0]));
    std::cout << "-> " << str << std::endl;
}

3voto

foobar1234 Points 91

Std::string possède une méthode appelée assign. Vous pouvez utiliser un char * et une taille.

http://www.cplusplus.com/reference/string/string/assign/

3voto

cpx Points 5936

Cela devrait le faire :

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X