Utilisation du caractère nul dans les chaînes (C ++)
Je suis brossage sur mon C++ et suis tombé sur un curieux comportement en ce qui concerne les chaînes de caractères, des tableaux de caractères, et le caractère null ('\0'
). Le code suivant:
#include <iostream>
using namespace std;
int main() {
cout << "hello#include <iostream>
using namespace std;
int main() {
cout << "hello\0there"[6] << endl;
char word [] = "hello\0there";
cout << word[6] << endl;
string word2 = "hello\0there";
cout << word2[6] << endl;
return 0;
}
there"[6] << endl;
char word [] = "hello#include <iostream>
using namespace std;
int main() {
cout << "hello\0there"[6] << endl;
char word [] = "hello\0there";
cout << word[6] << endl;
string word2 = "hello\0there";
cout << word2[6] << endl;
return 0;
}
there";
cout << word[6] << endl;
string word2 = "hello#include <iostream>
using namespace std;
int main() {
cout << "hello\0there"[6] << endl;
char word [] = "hello\0there";
cout << word[6] << endl;
string word2 = "hello\0there";
cout << word2[6] << endl;
return 0;
}
there";
cout << word2[6] << endl;
return 0;
}
produit de la sortie:
> t
> t
>
Ce qui se passe derrière les coulisses? Pourquoi la chaîne de caractères littérale et l'déclaré char tableau stocker les 't'
à l'indice 6 (d'après l'interne '\0'
), mais la chaîne déclarée ne l'est pas?
source d'informationauteur ewok
Vous devez vous connecter pour publier un commentaire.
De ce que je me souviens, les deux premiers sont, en substance, juste un tableau et à la manière d'une chaîne de caractères qui est imprimé est de continuer à imprimer jusqu'à ce qu'un
\0
est rencontrée. Ainsi, dans les deux premiers exemples, vous commencez à le décalage du point de la 6ème caractère dans la chaîne, mais dans votre cas, vous êtes l'impression de la 6ème caractère qui estt
.Ce qui se passe avec le
string
classe, c'est qu'il fait une copie de la chaîne dans une mémoire tampon interne et ne copier la chaîne de caractères à partir du début du tableau jusqu'à la première\0
qu'il trouve. Ainsi, let
n'est pas stocké parce qu'il vient après le premier\0
.Parce que le
std::string
constructeur qui prend unconst char*
traite son argument comme un C chaîne de style. Il a simplement des copies de lui jusqu'à ce qu'il frappe un null-terminator, puis s'arrête la copie.De sorte que votre dernier exemple est réellement appeler un comportement indéterminé;
word2[6]
va au-delà de la fin de la chaîne.Vous êtes en train de construire une chaîne à partir d'une
char*
(ou quelque chose qui pourri). Cela signifie que la convention de C-strings appliquer. C'est qu'ils sont'\0'
résilié. C'est pourquoiword2
ne contient"hello"
.Le problème, c'est que vous n'êtes pas l'impression de cordes - vous l'impression des caractères individuels.
Alors, vous êtes en invoquant le "char" surcharges, pas le "char*" ou "chaîne" des surcharges à tous, et les caractères NULL n'ont rien à voir avec ça : Vous êtes juste l'impression de la 6ème caractère de mot, et le 6ème caractère du mot2.
Si je suis la lecture de votre intention correctement, votre test doit lire:
En C++11 et plus tard ce sera également l'impression de "il y" Et bien défini