La chaîne ci-dessous contient-elle le terminateur nul ? '\0'
?
std::string temp = "hello whats up";
La chaîne ci-dessous contient-elle le terminateur nul ? '\0'
?
std::string temp = "hello whats up";
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.
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é.
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)temp.c_str()
o temp.data()
reviendra avec un null
terminatorint(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 :
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.
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 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.