2013-07-28 7 views
0

Из Rules for C++ string literals escape character, ответнулевой символ внутри строки

std::string ("0\0" "0", 3) // String concatenation 

работает, потому что эта версия конструктора принимает массив символов Эли; если вы попытаетесь просто передать «0 \ 0» «0» в качестве const char *, он будет рассматривать его как строку C и только скопировать все до нулевого символа.

Означает ли это, что пространство не выделено для целых строк, т. Е. Строка после \ 0 записывается в нераспределенное пространство?

Кроме того, вышеупомянутый вопрос предназначен для строки C++, я наблюдал такое же поведение и для строк c. Являются ли строки c и C++ одинаковыми при добавлении нулевого символа в середине строки во время объявления?

+0

Что вы пытаетесь сделать здесь: Почему вы должны использовать строки, а не только массивы символов? – hugomg

+0

Существует набор строк, которые могут быть представлены в виде массива указателей на char [], но представлены как char [] с \ 0 разделяющими строками и int [] для хранения смещений строк –

ответ

2

Массив символов копируется в новый объект. Если вы не укажете, как долго будет массив символов, C++ будет копировать до первого нулевого символа. Объем выделенного дополнительного пространства выходит за рамки спецификации. Как и векторы, строки имеют емкость, которая может превышать сумму, необходимую для хранения строки, и позволяет добавлять символы без перемещения строки.

+0

так что-то вроде \t char w [ ] = "QWE \ 0" "0uqwe"; \t printf ("% s \ n% s", w, w + 4); неправильно ? –

+0

'char w [] =" qwe \ 0 "" 0uqwe "вводит' const char * 'в' char [] '. Это неверно. – Oswald

+1

Объем строки не * полностью * выходит за рамки спецификации: вам гарантируется, что емкость> = размер. – Casey

0

std::string конструктор, который принимает const char*, предполагает, что вход является строкой C. Строки C: '\0' завершены и, таким образом, останавливаются при достижении символа '\ 0'.

Если вы действительно хотите играть, вам нужно использовать конструктор, который строит строку из массива символов (а не C-String).

контейнеры последовательности STL превышает сумму, необходимую для хранения автоматически

Пример:

int main() { 

string s="Elephant"; 

s[4] ='\0'; //C++ std::string is NOT '\0' terminated 
cout<<s<<endl; //Elep ant 

string x("xy\0ab"); // C-String assumed. 

cout<<x; //xy 
    return 0; 
} 
Смежные вопросы