100 votes

Comment construisez-vous un std :: string avec un null incorporé?

Si je veux construire un std :: string avec une ligne comme:

 std::string my_string("a\0b");
 

Là où je veux avoir trois caractères dans la chaîne résultante (a, null, b), je n'en ai qu'un. Quelle est la syntaxe appropriée?

143voto

Loki Astari Points 116129

Le problème est que les std::string constructeur qui prend un const char* suppose l'entrée est une chaîne C. C les chaînes sont '\0' terminée et donc l'analyse s'arrête quand il atteint le '\0' caractère.

Pour compenser cela, vous devez utiliser le constructeur qui construit la chaîne de caractères à partir d'un char array (pas un C-String). Elle prend deux paramètres, un pointeur vers le tableau et d'une longueur:

std::string   x("pq\0rs");   // Two characters because input assumed to be C-String
std::string   x("pq\0rs",5); // 5 Characters as the input is now a char array with 5 characters.

Remarque: C++ std::string n'est PAS '\0' terminé (comme expliqué dans d'autres posts). Si vous pouvez extraire un pointeur vers une mémoire tampon interne qui contient un C-String avec la méthode c_str().

Consultez également Doug .T ci-dessous sur l'utilisation d'un vector<char>

22voto

Doug T. Points 33360

Si vous faites de la manipulation comme vous le feriez avec un style c string (tableau de caractères) envisager d'utiliser

std::vector<char>

Vous avez plus de liberté à le traiter comme un tableau de la même manière que vous le feriez à un c-string. Vous pouvez utiliser la copie() pour copier une chaîne de caractères:

std::vector<char> vec(100)
strncpy(&vec[0], "blah blah blah", 100);
std::string vecAsStr( vec.begin(), vec.end());

et vous pouvez l'utiliser dans les mêmes endroits que vous pouvez utiliser c-strings

printf("%s" &vec[0])
vec[10] = '\0';
vec[11] = 'b';

Naturellement, cependant, vous souffre des mêmes problèmes que c-strings. Vous pouvez oublier votre null terminal ou écrire passé l'espace alloué.

13voto

17 of 26 Points 15941

Je ne sais pas pourquoi vous voudriez faire une chose pareille, mais essayez ceci:

 std::string my_string("a\0b", 3);
 

13voto

anonym Points 51

Défini par l'utilisateur littérales en C++11, un grand besoin de plus ou de prise de C++ même plus gonflé? présente un élégant la réponse: à Définir

std::string operator "" _s(const char* str, size_t n) 
{ 
    return std::string(str, n); 
}

ensuite, vous pouvez créer votre chaîne de cette façon:

std::string my_string("a\0b"_s);

ou même si:

auto my_string = "a\0b"_s;

Il y a un "vieux style" façon:

#define S(s) s, sizeof s - 1 // trailing NUL does not belong to the string

ensuite, vous pouvez définir

std::string my_string(S("a\0b"));

8voto

Andrew Stein Points 6344

Ce qui suit va marcher ...

 std::string s;
s.push_back('a');
s.push_back('\0');
s.push_back('b');
 

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