2013-07-22 9 views

risposta

4

std::string è molto un std::vector: ha un attributo di lunghezza e non è zero terminato in C++ 03; in C++ 11 'std :: string' sembra essere terminato, ma trovo più facile pensare a 'std :: string' come a 'std :: vector' di caratteri e non solo a un buffer terminato.

+3

Inoltre, 'c_str()' può essere utilizzato per ottenere la stringa terminata da zero di tipo C . – Naveen

+4

Non è semplice come "no". Non deve esserci una terminazione nulla tra '[begin(), end())', ma sia 'c_str()' che 'data()' restituiscono un puntatore a un array terminato da null. – juanchopanza

+0

@juanchopanza Questo è solo in C++ 11. –

-1

std :: string :: dati

restituisce un puntatore a una matrice che contiene la stessa sequenza di caratteri come i caratteri che compongono il valore dell'oggetto stringa.

L'accesso al valore su data() + size() produce un comportamento non definito: non ci sono garanzie che un carattere nullo termini la sequenza di caratteri puntata dal valore restituito da questa funzione. Vedere string :: c_str per una funzione che fornisce tale garanzia.

Un programma non deve alterare nessuno dei caratteri in questa sequenza.

+4

In C++ 11, 'data()' e 'c_str()' sono effettivamente gli stessi - entrambi saranno nulli terminati . –

+1

+1 @CoryNelson Grazie, Cx11 std :: string :: data: restituisce un puntatore a un array che contiene una sequenza di caratteri con terminazione null (cioè una stringa C) che rappresenta il valore corrente dell'oggetto stringa. Questo array include la stessa sequenza di caratteri che costituisce il valore dell'oggetto stringa più un carattere null finale ("\ 0") alla fine. Il puntatore ha restituito i punti all'array interno attualmente utilizzato dall'oggetto stringa per memorizzare i caratteri che ne conformano il valore. Sia string :: data che string :: c_str sono sinonimi e restituiscono lo stesso valore. –

9

In C++ 03, non è stato necessario memorizzare una stringa std :: string in un buffer con terminazione NUL, ma se si chiamasse c_str(), si restituirebbe un puntatore a un buffer con terminazione NUL. Tale buffer potrebbe essere legalmente creato e/o terminato all'interno della chiamata c_str().

In C++ 11, tutti std::string istanze vengono terminati, così data() affronta anche un buffer NUL-terminato, e anche s[s.size()] ha un significato ben definito che restituisce un riferimento alla NUL terminazione.

+0

Quindi si riduce a quale lingua si desidera interfacciarsi? Se è necessario interfacciare una funzione C, utilizzare c_str() per ottenere un puntatore a un array di caratteri con terminazione null. Se hai bisogno di interfacciarti con un'altra funzione C++, probabilmente si aspetta std :: string, che non è garantito che sia terminato con null (se hai bisogno anche di C++ 03). – Keplerian

+1

@Keplerian: si usa effettivamente 'c_str()' quando si chiama una funzione C in attesa di un buffer ASCIIZ tramite 'const char *', e si potrebbe usare '& s [0], s.size()' per passare un (non- 'const)' char * 'e' size_t' a una funzione C che pianifica di modificare il contenuto del buffer - ma prima di C++ 11 non è garantito NUL-terminato e devi prima controllare '! s.empty()' & s [0] comportamento non definito. Per le altre funzioni del C++ che prevedono 'std :: string', non dovresti promettere nulla sulla terminazione NUL, dato che useranno presumibilmente' .size() ',' .end() 'ecc. –

+0

Vedi anche [la mia risposta qui] (http://stackoverflow.com/questions/347949/how-to-convert-a-stdstring-to-const-char-or-char/4152881#4152881). –

Problemi correlati