Навіть знаючи, що ви бачили, що вони роблять те саме, або що .data () викликає .c_str (), невірно вважати, що це стосується інших компіляторів. Можливо також, що ваш компілятор зміниться з майбутнім випуском.
2 причини використовувати std :: string:
std :: string може використовуватися як для текстових, так і для довільних двійкових даних.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Ви повинні використовувати .c_str () метод, коли ви використовуєте рядок як приклад 1.
Ви повинні використовувати метод .data (), коли ви використовуєте рядок як приклад 2. Не тому, що в цих випадках небезпечно використовувати .c_str (), а тому, що явніше, що ви працюєте з бінарними даними для рецензування інших. свій код.
Можливий підводний камінь із використанням .data ()
Наступний код невірний і може спричинити сегментацію у вашій програмі:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Чому виконавцям прийнято змушувати .data () і .c_str () робити те саме?
Бо ефективніше це зробити. Єдиний спосіб змусити .data () повернути щось, що не закінчується, було б .c_str () або .data () скопіювати свій внутрішній буфер або просто використовувати 2 буфери. Наявність одного буфера, що закінчується нулем, завжди означає, що ви завжди можете використовувати лише один внутрішній буфер при реалізації std :: string.
.data()
, тому вони вже не еквівалентні для нестабільних рядків.