La chaîne ci-dessous contiendra-t-elle le terminateur nul '\ 0'?
std::string temp = "hello whats up";
Merci! :)
La chaîne ci-dessous contiendra-t-elle le terminateur nul '\ 0'?
std::string temp = "hello whats up";
Merci! :)
Réponses:
Non, mais si vous dites temp.c_str()
qu'un terminateur nul sera inclus dans le retour de cette méthode.
Cela vaut également la peine de dire que vous pouvez inclure un caractère nul dans une chaîne comme n'importe quel autre caractère.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
impressions
5 5
et pas 5 1
comme on pourrait s'y attendre si les caractères nuls avaient une signification particulière pour les chaînes.
temp.c_str()
le caractère nul sera inclus. Si vous en avez vraiment besoin dans la chaîne, ajoutez-le simplement comme n'importe quel autre caractère. temp.push_back('\0')
. Maintenant , temp.c_str()
comprendra deux caractères nuls.
Pas en C ++ 03, et il n'est même pas garanti avant C ++ 11 que dans un C ++ std :: string soit continu en mémoire. Seules les chaînes C (tableaux de caractères destinés à stocker des chaînes) avaient le terminateur nul.
Dans C ++ 11 et versions ultérieures, mystring.c_str()
équivaut à mystring.data()
est équivalent à &mystring[0]
et mystring[mystring.size()]
est garanti '\0'
.
Cela dépend de votre définition de «contenir» ici. Dans
std::string temp = "hello whats up";
il y a peu de choses à noter:
temp.size()
renverra le nombre de caractères du premier h
au dernier p
(les deux inclus)temp.c_str()
ou temp.data()
reviendra avec un null
terminateurint(temp[temp.size()])
sera nulJe sais, je semble similaire à quelques - unes des réponses ici , mais je tiens à souligner que size
d' std::string
en C++
est maintenue séparément et il est pas comme dans C
où vous gardez le comptage à moins que vous trouvez la première null
terminaison.
Pour ajouter, l'histoire serait un peu différente si votre string literal
contient intégré \0
. Dans ce cas, la construction des std::string
arrêts au premier null
caractère, comme suit:
std::string s1 = "ab\0\0cd"; // s1 contains "ab", using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd", using ""s operator
Références:
Oui, si vous appelez temp.c_str()
, il renverra une chaîne de caractères terminée par null.
Cependant, les données réelles stockées dans l'objet temp
peuvent ne pas être terminées par null, mais cela n'a pas d'importance et ne devrait pas avoir d'importance pour le programmeur, car quand le programmeur le veut const char*
, il appellerait c_str()
l'objet, ce qui est garanti pour retourner null - chaîne terminée.
temp.size()
.
Avec les chaînes C ++, vous n'avez pas à vous en soucier, et cela dépend peut-être de l'implémentation.
En utilisant, temp.c_str()
vous obtenez une représentation C de la chaîne, qui contiendra certainement le \0
char. A part ça, je ne vois pas vraiment en quoi cela serait utile sur une chaîne C ++
std::string
conserve en interne un décompte du nombre de caractères. En interne, cela fonctionne en utilisant ce décompte. Comme d'autres l'ont dit, lorsque vous avez besoin de la chaîne pour l'affichage ou pour quelque raison que ce soit, vous pouvez c_str()
utiliser sa méthode qui vous donnera la chaîne avec le terminateur nul à la fin.