Warum würde ich jemals std::string::data()
über std::string::c_str()
anrufen wollen? Sicherlich gibt es hier eine Methode zur Verrücktheit des Standards ...Was ist der Unterschied zwischen std :: string :: c_str und std :: string :: data?
Antwort
c_str() garantiert NUL-Terminierung. data() nicht.
Ich dachte, es wäre etwas Einfaches, das ich übersehen hätte - danke! – fbrereto
In Wirklichkeit verweisen sie jedoch wahrscheinlich auf dasselbe (nicht dass Sie sich darauf verlassen sollten). – Zifre
@ Zifre: Sie können auf die gleiche Adresse verweisen, aber nach einer Mutationsoperation (str + = "...") könnte die Implementierung den internen Datenpuffer ohne die Null-Beendigung verlassen und nur das '\ 0' hinzufügen Die Methode c_str() wird aufgerufen. –
c_str() gibt einen Zeiger auf die Daten mit einem angehängten NUL-Byte zurück, so dass Sie den Rückgabewert als "C-Zeichenfolge" verwenden können.
data() gibt einen Zeiger auf die Daten ohne irgendwelche Änderungen zurück.
Verwenden Sie c_str(), wenn der von Ihnen verwendete Code davon ausgeht, dass eine Zeichenfolge NULL-terminiert ist (z. B. jede Funktion, die für die Verarbeitung von C-Zeichenfolgen geschrieben wurde).
in MS STL Jetzt 10.0 scheint es keinen Unterschied zu sein, wie ich dies in der Kopfzeile sehen:
... \ Microsoft Visual Studio 10.0 \ VC \
const _Elem *c_str() const
{ // return pointer to null-terminated nonmutable array
return (_Myptr());
}
const _Elem *data() const
{ // return pointer to nonmutable array
return (c_str());
}
\ xstring
umfassen
So geben sie das gleiche zurück.
Es sieht auch so aus, als ob es in VC 9.0 genauso ist. –
Dieses Verhalten wird vom aktuellen Standard zugelassen und vom nächsten Standard benötigt. Ich vermute, dass die meisten Bibliotheken dies schon seit einiger Zeit tun, um den Umstieg vorzubereiten. –
Danke Dennis. –
- 1. Unterschied zwischen Std: String und Std :: String
- 2. std :: string :: c_str() und Provisorien
- 3. Was ist der Unterschied zwischen std :: string und std :: basic_string? Und warum werden beide benötigt?
- 4. Was ist der Unterschied zwischen string :: at und string :: operator []?
- 5. Was ist der Unterschied zwischen std :: to_string, boost :: to_string und boost :: lexical_cast <std::string>?
- 6. Was ist der Unterschied zwischen std :: cout und std :: wcout?
- 7. Was ist der Unterschied zwischen std :: set und std :: map
- 8. Was ist der Unterschied zwischen std :: partial_sum und std :: inclusive_scan?
- 9. Was ist der Unterschied zwischen std :: function und std :: mem_fn
- 10. Vergleich zwischen Std: String und C-String
- 11. string und const char * und .c_str()?
- 12. Was ist der Unterschied zwischen std :: tie und std :: make_tuple mit std :: ref-Argumenten?
- 13. Was ist der Unterschied zwischen [] String und ... String in Golang?
- 14. Unterschied zwischen std :: Suche und std :: find_first_of
- 15. Liefert std :: string :: c_str() immer eine nullterminierte Zeichenkette?
- 16. Unterschied zwischen std :: set und std :: priority_queue
- 17. Std :: String und Std :: Map-Operationen auf Unicode-String
- 18. Was ist der Unterschied zwischen Boost Smartpointern und Std Smartpointern?
- 19. std :: string und std :: ios :: binary
- 20. Unterschied zwischen std :: regex_match & std :: regex_search?
- 21. Unterschied zwischen std :: exception und "..."
- 22. Leistung std :: strstr vs. std :: string ::
- 23. Unterschied zwischen String und String
- 24. Was ist der Unterschied zwischen [string()] und list() in erlang?
- 25. Unterschied zwischen std :: uninitialized_copy & std :: copy?
- 26. Unterschied zwischen @string und @ + string?
- 27. Was ist der Grund für den Unterschied im Zerstörungsverhalten zwischen std :: unique_ptr und std :: shared_ptr?
- 28. SWIG: Wie umbrechen std :: string & (std :: String übergeben durch Verweis)
- 29. std :: string length() und size() Member-Funktionen
- 30. Convert uint8 * std :: string
Würde nur darauf hinweisen, dass in der nächsten Version von C++ [C++ 11 oder C++ 0x oder was auch immer Sie es nennen möchten], die beiden Funktionen auch synonym sind. –