131 votes

Est-ce que std::string a un terminateur nul ?

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

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

135voto

jahhaj Points 2855

Non, mais si vous dites temp.c_str() un terminateur nul sera inclus dans le retour de cette méthode.

Il convient également de préciser que vous pouvez inclure un caractère nul dans une chaîne de caractères comme n'importe quel autre caractère.

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

imprime

5 5

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

117voto

Pas dans 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 de caractères C (les tableaux de caractères qui sont destinés à stocker des chaînes de caractères) avaient le terminateur nul.

Dans les versions C++11 et ultérieures, mystring.c_str() est équivalent à mystring.data() est équivalent à &mystring[0] y mystring[mystring.size()] est garanti '\0' .

En C++17 et plus, mystring.data() fournit également une surcharge qui renvoie un pointeur non-const vers le contenu de la chaîne de caractères, tandis que la commande mystring.c_str() fournit uniquement un const -Pointeur qualifié.

21voto

aniliitb10 Points 980

Cela dépend de votre définition du terme "contenir". Sur

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

il y a quelques points à noter :

  • temp.size() retournera le nombre de caractères du premier h pour durer p (les deux inclus)
  • Mais en même temps temp.c_str() o temp.data() reviendra avec un null terminator
  • 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 sur C++ est maintenu séparément et ce n'est pas comme sur C où vous continuez à compter jusqu'à ce que vous trouviez la première null Terminator.

Pour ajouter, l'histoire serait un peu différente si votre string literal contient des éléments intégrés \0 . Dans ce cas, la construction de std::string s'arrête au premier 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

Références :

2voto

Nawaz Points 148870

Oui, si vous appelez temp.c_str() alors il renverra une chaîne de caractères à terminaison nulle.

Cependant, les données réelles stockées dans l'objet temp peut ne pas être à terminaison nulle, mais cela n'a pas d'importance et ne devrait pas en avoir pour le programmeur, parce que lorsque ce dernier veut const char* Il appelle c_str() sur l'objet, ce qui garantit le retour d'une chaîne de caractères à terminaison nulle.

1voto

Naps62 Points 552

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

Utilisation de temp.c_str() vous obtenez une représentation C de la chaîne de caractères, qui contiendra certainement l'élément \0 char. En dehors de cela, je ne vois pas vraiment comment cela pourrait être utile sur une chaîne C++.

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