2009-10-07 21 views

Antwort

18

c_str() garantiert NUL-Terminierung. data() nicht.

+0

Ich dachte, es wäre etwas Einfaches, das ich übersehen hätte - danke! – fbrereto

+1

In Wirklichkeit verweisen sie jedoch wahrscheinlich auf dasselbe (nicht dass Sie sich darauf verlassen sollten). – Zifre

+6

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

5

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

1

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.

+0

Es sieht auch so aus, als ob es in VC 9.0 genauso ist. –

+0

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

+0

Danke Dennis. –

Verwandte Themen