Что означает "\ 0"?
Я не могу понять, что означает "\ 0" в двух разных местах в следующем коде:
string x = "hhhdef\n";
cout << x << endl;
x[3]='\0';
cout << x << endl;
cout<<"hhh\0defef\n"<<endl;
Результат:
hhhdef
hhhef
HHH
Может ли кто-нибудь дать мне несколько указателей?
Ответы
Ответ 1
С++ std::string
являются "подсчитанными" строками, т.е. их длина сохраняется как целое число, и они могут содержать любой символ. Когда вы заменяете третьего символа символом \0
, ничего особенного не происходит - оно печатается так, как будто это был любой другой символ (в частности, ваша консоль просто игнорирует его).
В последней строке вместо этого вы печатаете строку C, конец которой определяется первым \0
, который найден. В таком случае cout
продолжает печатать символы, пока не найдет \0
, который в вашем случае будет после третьего h
.
Ответ 2
С++ имеет два типа строк:
Встроенные строки с нулевым завершением в стиле C, которые на самом деле представляют собой только байт-массивы и класс стандартной библиотеки С++ std::string
, который не завершен нулем.
Печать строки с нулевым завершением печатает все до первого нулевого символа. Печать std::string
печатает всю строку, независимо от нулевых символов в ее середине.
Ответ 3
\0
является символом NULL, вы можете найти его в своем ASCII table
, он имеет значение 0.
Используется для определения конца строк в стиле C.
Однако класс С++ std::string
сохраняет свой размер как целое число и, следовательно, не полагается на него.
Ответ 4
Здесь вы представляете строки двумя разными способами, поэтому поведение отличается.
Второй легче объяснить; это исходный массив char в стиле C. В строке стиля C '\0'
обозначает нулевой ограничитель; он использовал для обозначения конца строки. Таким образом, любые функции, которые обрабатывают/отображают строки, останавливаются, как только они ударяют его (вот почему ваша последняя строка усечена).
Первый пример - создание полностью сформированного объекта С++ std::string
. Они не придают особого значения '\0'
(у них нет нулевых терминаторов).