2013-07-22 4 views

Odpowiedz

4

std::string jest w dużym stopniu std::vector: ma atrybut długości i nie jest zakończony zerem w C++ 03; w C++ 11 'std :: string' wydaje się być zakończony, ale uważam, że łatwiej jest myśleć o "std :: string" jako "std :: vector" znaków, a nie tylko o zakańczonym buforze.

+3

Dodatkowo, 'c_str()' może być użyte do uzyskania łańcucha zakończonego znakiem C typu C . – Naveen

+4

To nie jest tak proste, jak "nie". Nie musi istnieć zerowe zakończenie między '[begin(), end())', ale zarówno 'c_str()' jak i 'data()' zwracają wskaźnik do tablicy zakończonej znakiem NUL. – juanchopanza

+0

@juanchopanza To tylko w C++ 11. –

-1

std :: string :: dane

Zwraca wskaźnik do tablicy, która zawiera tę samą sekwencję znaków jako znaków, które tworzą wartość obiektu String.

Uzyskanie dostępu do wartości w danych() + size() powoduje niezdefiniowane zachowanie: Nie ma gwarancji, że znak zerowy zakończy sekwencję znaków wskazywaną przez wartość zwróconą przez tę funkcję. Zobacz ciąg :: c_str dla funkcji zapewniającej taką gwarancję.

Program nie zmienia żadnego ze znaków w tej sekwencji.

+4

W C++ 11, 'data()' i 'c_str()' są w rzeczywistości takie same - oba będą zakończone z wartością null . –

+1

+1 @CoryNelson Dzięki, Cx11 std :: string :: data: Zwraca wskaźnik do tablicy zawierającej zakończoną znakiem Null sekwencję znaków (tj. Ciąg znaków C) reprezentujący bieżącą wartość obiektu typu string. Ta tablica zawiera tę samą sekwencję znaków, które składają się na wartość obiektu napisowego plus dodatkowy, kończący znak null ("\ 0") na końcu. Wskaźnik zwrócił punkty do wewnętrznej tablicy aktualnie używanej przez obiekt tekstowy do przechowywania znaków zgodnych z jej wartością. Obie ciągi :: dane i ciąg :: c_str są synonimami i zwracają tę samą wartość. –

9

W C++ 03, std :: string nie musiał być przechowywany w buforze zakończonym NUL, ale jeśli wywołałeś c_str(), zwróciłby wskaźnik do bufora zakończonego NUL. Ten bufor mógł być legalnie utworzony i/lub zakończony wewnątrz połączenia c_str().

C++ 11, wszystkie std::string przypadki są zakończone, tak data() dotyczy również znakiem NUL bufor, a nawet s[s.size()] ma dobrze zdefiniowane znaczenie przekazujących odniesienie do zakończenia NUL.

+0

Czy sprowadza się to do języka, z którym chcesz się połączyć? Jeśli potrzebujesz interfejsu do funkcji C, użyj c_str(), aby uzyskać wskaźnik do zakończonej znakiem Null tablicy znaków. Jeśli potrzebujesz interfejsu z inną funkcją C++, prawdopodobnie spodziewasz się std :: string, który nie ma gwarancji, że zostanie zakończony znakiem NUL (jeśli chcesz również obsłużyć C++ 03). – Keplerian

+1

@Keplerian: rzeczywiście użyłbyś 'c_str()' podczas wywoływania funkcji C oczekującej na bufor ASCIIZ przez 'const char *', i mógł użyć 'i s [0], s.size()' do przekazania a (nie 'const)' char * 'i' size_t' do funkcji C planującej modyfikację zawartości bufora - ale przed C++ 11 nie ma gwarancji zakończenia NUL i musisz najpierw sprawdzić '! s.empty()', aby uniknąć ' & s [0] 'niezdefiniowane zachowanie. W przypadku innych funkcji C++, oczekujących 'std :: string', nie powinieneś obiecywać im niczego na temat zakończenia NUL, ponieważ prawdopodobnie będą używać' .size() ',' .end() 'etc .. –

+0

Zobacz również [moja odpowiedź tutaj] (http://stackoverflow.com/questions/347949/how-to-convert-a-stdstring-to-const-char-or-char/4152881#4152881). –

Powiązane problemy