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. –
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. –