Même sachant que vous avez vu qu'ils font de même, ou que .data() appelle .c_str(), il n'est pas correct de supposer que ce sera le cas pour d'autres compilateurs. Il est également possible que votre compilateur change avec une future version.
2 raisons d'utiliser std :: string:
std :: chaîne peut être utilisée pour le texte et les données binaires arbitraires.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Vous devez utiliser la méthode .c_str() lorsque vous utilisez votre chaîne comme exemple 1.
Vous devez utiliser la méthode .data() lorsque vous utilisez votre chaîne comme exemple 2. Non car il est dangereux d'utiliser .c_str() dans ces cas, mais parce qu'il est plus explicite que vous utilisiez des données binaires pour d'autres personnes qui examinent votre code.
possible avec l'aide de piège .data()
Le code suivant est mauvais et pourrait provoquer une erreur de segmentation dans votre programme:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Pourquoi est-il commun de faire .data implémenteurs() et .c_str() font la même chose?
Parce qu'il est plus efficace de le faire. La seule façon de rendre .data() retourner quelque chose qui n'est pas terminé par null, serait d'avoir .c_str() ou .data() copier leur tampon interne, ou simplement utiliser 2 tampons. Avoir un seul tampon à terminaison nulle signifie toujours que vous pouvez toujours utiliser un seul tampon interne lors de l'implémentation de std :: string.
En fait, le point de .data() est qu'il ne devrait pas copier le tampon interne. Cela signifie qu'une implémentation ne doit pas gaspiller un caractère sur \ 0 tant que cela n'est pas nécessaire. Vous ne voudrez jamais deux tampons: si vous appelez .c_str(), ajoutez un \ 0 au tampon. .data() peut toujours retourner ce tampon. – MSalters
D'accord, il serait ridicule d'utiliser 2 tampons. Comment savez-vous que c'est la raison pour laquelle .data était prévu? –
@ BrianR.Bondy J'ai essayé ce code: ..auto str = string {"Test \ 0String!" } cout << "DATA:" << str.data() << endl; La sortie est "Test" et non toute la chaîne, Qu'ai-je fait de mal? – programmer