Да, вы правы в отношении
станд :: строка :: c_str .
В самом деле,
Возвращает указатель на массив символов с нулем в конце с данными, эквивалентными тем, которые хранятся в строке.
Однако есть несколько соображений, которые, вероятно, вводят вас в заблуждение.
Прежде всего, утверждение:
a = a.c_str();
семантически a бездействие .
Вы получаете const char*
(т.е. "Hello World\0"
) и назначаете его на a
.
Однако a
- это std::string
, это класс, разработанный для абстрагирования «строкового типа» в C ++. Он обрабатывает автоматически '\0'
, прозрачно. Пользователь не должен заботиться об управлении им 1 .
Трюк внутри std::string::operator=(const char*)
.
Заменяет содержимое на символьную строку с нулевым символом в конце, на которую указывает s , как будто с помощью assign (s, Traits :: length (s)) .
Последний пункт, о конкатенации строк .
a + string("aaa");
Как и ранее, в этом случае оператор std::string::operator+
будет обрабатывать '\0'
.
Короче, он ведет себя как:
"Hello World\0" + "aaa\0" ===> "Hello Worldaaa\0"
Он позаботится о том, чтобы "inner '\0'
" возвращал соответствующую строку с нулевым символом в конце.
1 Если он / она не играет с внутренней памятью.