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?
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?
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>
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é.
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"));
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.