Remarque: std::string's c_str() membre sera toujours ajouter un caractère null pour le retour de char buffer; Cependant, std::string's data() membre peut ou peut ne pas ajouter un caractère null pour le retour de char tampon.
Attention de l'opérateur+=
Une chose à regarder dehors pour est de ne pas utiliser operator+= avec un char* sur les RHS. Il ne fera qu'ajouter jusqu'à ce que le caractère nul.
Par exemple:
std::string s ="hello";
s +="
std::string s ="hello";
s +="\0world";
assert(s.length()==5);
world";
assert(s.length()==5);
La façon correcte:
std::string s ="hello";
s += std::string("
std::string s ="hello";
s += std::string("\0world",6);
assert(s.length()==11);
world",6);
assert(s.length()==11);
Stocker des données binaires plus courant d'utiliser std::vector
En général, il est plus courant d'utiliser std::vector pour stocker des données binaires arbitraires.
Il est probablement plus fréquente depuis std::string's data() et c_str() de retour des membres const pointeurs de sorte que la mémoire n'est pas modifiable. avec &buf.avant (), vous êtes libre de modifier le contenu de la mémoire tampon directement.
En C++9x &s.front() est également modifiable et garanti à point à une mémoire tampon contiguë. Il n'y a aucune garantie en C++03, il n'existe pas de C++ implémentations pour ce qui n'était pas le cas en pratique (qui est en partie pourquoi il a été ajouté pour C++0x si vite). Notez que comme du C++11, .c_str() et .data sont synonymes. En particulier, cela signifie que la chaîne de caractères retournée par .data doit avoir un terminateur null ajouté. Je présume que "C++9x" était une faute de frappe pour "C++0x" (qui est devenu C++11 est peu de temps après que vous avez posté votre commentaire). s.append("\0world", 6); est mieux que s += std::string("\0world", 6);
Oui. Un std::string est juste un vector<char> avec des avantages.
Cependant, soyez prudent sur la transmission telle une bête à quelque chose qui appelle .c_str() et s'arrête à l'0.
La première n'est pas vrai, comme je l'ai appris récemment. Vecteur d'échange de conserve les itérateurs et les références à la table des matières, la chaîne n'est pas nécessairement. stackoverflow.com/questions/25201758/... Il a un nom différent, trop! Oh l'horreur
Vous pouvez, mais pourquoi voudriez-vous? L'incorporation NUL dans un std::string est juste des ennuis, parce que les fonctions qui vous passe un std::string peut très bien s'en servir, c'est c_str() membre, et la plupart supposent que les premiers NUL indique la fin de la chaîne. Ce n'est donc pas une bonne idée de le faire. Notez également qu'en UTF-8, seulement '\0' entraînera une 0, de sorte que même pour l'i18n fins, il n'existe aucune justification pour l'incorporation de NULs.
Merci pour expliquer pourquoi pas pour le faire. Non, c'est idiot. "Ne pas utiliser la gamme complète de std::string's de la fonctionnalité, parce que vous transmettre le résultat de c_str() à C-les fonctions de chaîne sans passage d'une longueur", vraiment? Eh bien, si vous n'avez jamais le faire, vous serez bien...
Vous pouvez avoir un caractère nul dans le milieu de la chaîne.
Toutefois, si vous utilisez un std::string par un caractère null dans le milieu avec une chaîne c
fonction de votre comportement indéfini de la ville - et personne ne veut y être!!!:
int n = strlen( strWithNullInMiddle.c_str());//Boom!!!
strlen va juste retourner le nombre de caractères avant le premier null. Il peut être imprévues comportement, mais ce n'est pas indéfini.
Oui, vous pouvez avoir intégré les valeurs null dans votre
std::string
.Exemple:
Remarque:
std::string
'sc_str()
membre sera toujours ajouter un caractère null pour le retour de char buffer; Cependant,std::string
'sdata()
membre peut ou peut ne pas ajouter un caractère null pour le retour de char tampon.Attention de l'opérateur+=
Une chose à regarder dehors pour est de ne pas utiliser
operator+=
avec unchar*
sur les RHS. Il ne fera qu'ajouter jusqu'à ce que le caractère nul.Par exemple:
La façon correcte:
Stocker des données binaires plus courant d'utiliser std::vector
En général, il est plus courant d'utiliser
std::vector
pour stocker des données binaires arbitraires.Il est probablement plus fréquente depuis
std::string
'sdata()
etc_str()
de retour des membres const pointeurs de sorte que la mémoire n'est pas modifiable. avec &buf.avant (), vous êtes libre de modifier le contenu de la mémoire tampon directement.&s.front()
est également modifiable et garanti à point à une mémoire tampon contiguë. Il n'y a aucune garantie en C++03, il n'existe pas de C++ implémentations pour ce qui n'était pas le cas en pratique (qui est en partie pourquoi il a été ajouté pour C++0x si vite).Notez que comme du C++11,
.c_str()
et.data
sont synonymes. En particulier, cela signifie que la chaîne de caractères retournée par.data
doit avoir un terminateur null ajouté.Je présume que "C++9x" était une faute de frappe pour "C++0x" (qui est devenu C++11 est peu de temps après que vous avez posté votre commentaire).
s.append("\0world", 6);
est mieux ques += std::string("\0world", 6);
OriginalL'auteur Brian R. Bondy
Oui. Un std::string est juste un
vector<char>
avec des avantages.Cependant, soyez prudent sur la transmission telle une bête à quelque chose qui appelle
.c_str()
et s'arrête à l'0.Il a un nom différent, trop! Oh l'horreur
OriginalL'auteur bmargulies
Vous pouvez, mais pourquoi voudriez-vous? L'incorporation NUL dans un std::string est juste des ennuis, parce que les fonctions qui vous passe un std::string peut très bien s'en servir, c'est c_str() membre, et la plupart supposent que les premiers NUL indique la fin de la chaîne. Ce n'est donc pas une bonne idée de le faire. Notez également qu'en UTF-8, seulement '\0' entraînera une 0, de sorte que même pour l'i18n fins, il n'existe aucune justification pour l'incorporation de NULs.
Non, c'est idiot. "Ne pas utiliser la gamme complète de
std::string
's de la fonctionnalité, parce que vous transmettre le résultat dec_str()
à C-les fonctions de chaîne sans passage d'une longueur", vraiment? Eh bien, si vous n'avez jamais le faire, vous serez bien...OriginalL'auteur Michael Aaron Safyan
Yep c'est valable.
Vous pouvez avoir un caractère nul dans le milieu de la chaîne.
Toutefois, si vous utilisez un std::string par un caractère null dans le milieu avec une chaîne c
fonction de votre comportement indéfini de la ville - et personne ne veut y être!!!:
strlen
va juste retourner le nombre de caractères avant le premier null. Il peut être imprévues comportement, mais ce n'est pas indéfini.OriginalL'auteur Robben_Ford_Fan_boy