web-dev-qa-db-fra.com

Std :: string contient-il un terminateur nul?

La chaîne ci-dessous contiendra-t-elle le terminateur nul '\ 0'?

std::string temp = "hello whats up";

Merci! :)

63
mister

Non, mais si vous dites temp.c_str(), 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 tout autre caractère.

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

empreintes

5 5

et pas 5 1 comme on pouvait s'y attendre si les caractères nuls avaient une signification particulière pour les chaînes.

74
jahhaj

Pas en C++ 03, et avant C++ 11, rien ne garantit que std :: string en C++ est continu en mémoire. Seules les chaînes C (les 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() équivaut à &mystring[0] Et il est garanti que mystring[mystring.size()] soit '\0'.

47
user529758

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() retournera le nombre de caractères de la première h à la dernière p
  • Mais en même temps, temp.c_str() ou temp.data() retournera avec un terminateur null
  • Ou en d'autres termes, int(temp[temp.size()]) sera zéro

Je sais, je ressemble à certaines des réponses ici, mais je tiens à souligner que size de std::string Dans C++ Est maintenu séparément et ce n'est pas comme dans C où vous continuez à compter à moins que vous ne trouviez le premier null terminateur.

Pour ajouter, l'histoire serait un peu différente si votre string literal Contient incorporé \0. Dans ce cas, la construction de std::string S'arrête au premier caractère null, 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

Les références:

5
aniliitb10

Oui, si vous appelez temp.c_str(), il renverra une chaîne de caractères terminée par un zéro.

Cependant, les données réelles stockées dans l'objet temp ne sont peut-être pas terminées par zéro, mais cela n'a pas d'importance et ne devrait pas importer pour le programmeur, car lorsque le programmeur veut alors const char*, Il appellerait c_str() sur l'objet, ce qui garantit de retourner une chaîne terminée par un caractère nul.

2
Nawaz

Avec les chaînes C++, vous n'avez pas à vous en préoccuper et cela dépend probablement de l'implémentation.

En utilisant temp.c_str(), vous obtenez une représentation en C de la chaîne, qui contiendra certainement le \0 char. En dehors de cela, je ne vois pas vraiment en quoi cela serait utile sur une chaîne C++

1
Naps62

std::string En interne conserve un compte du nombre de caractères. En interne, cela fonctionne avec ce nombre. Comme d’autres l’ont dit, lorsque vous avez besoin de la chaîne pour l’affichage ou pour une raison quelconque, vous pouvez utiliser sa méthode c_str() qui vous donnera la chaîne avec le terminateur nul à la fin.

1
Superman