Anche sapendo che hai visto che fanno lo stesso, o che .data () chiama .c_str (), non è corretto presumere che questo sarà il caso di altri compilatori. È anche possibile che il tuo compilatore cambi con una versione futura.
2 motivi per utilizzare std :: string:
std :: string può essere utilizzato sia per testo che per dati binari arbitrari.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Dovresti usare il metodo .c_str () quando usi la tua stringa come esempio 1.
Dovresti usare il metodo .data () quando usi la tua stringa come esempio 2. Non perché sia pericoloso usare .c_str () in questi casi, ma perché è più esplicito che stai lavorando con dati binari per altri il tuo codice.
Possibile insidia con l'utilizzo di .data ()
Il codice seguente è sbagliato e potrebbe causare un segfault nel tuo programma:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Perché è comune che gli implementatori facciano la stessa cosa .data () e .c_str ()?
Perché è più efficiente farlo. L'unico modo per fare in modo che .data () restituisca qualcosa che non è terminato da null, sarebbe avere .c_str () o .data () copiare il loro buffer interno, o usare solo 2 buffer. Avere un singolo buffer con terminazione null significa sempre che puoi sempre usare un solo buffer interno quando implementi std :: string.
.data()
, quindi non sono più equivalenti per le stringhe non costanti.