std::ends
- это просто нулевой символ. Традиционно строки в C и C ++ заканчиваются нулевым символом (ascii 0), однако оказывается, что std::string
на самом деле не требует этого. В любом случае, шаг за шагом пройдя ваш код, мы увидим несколько интересных вещей:
int main( int argc, char** argv )
{
Строковый литерал "hello"
- это традиционная строковая константа с нулевым символом в конце. Мы копируем это целое в std::string
HELLO.
const std::string HELLO( "hello" );
std::stringstream testStream;
Теперь мы помещаем string
HELLO (включая завершающий 0) в stream
, за которым следует второй ноль, который ставится там при вызове std::ends
.
testStream << HELLO << std::ends;
Мы извлекаем копию материала, который мы помещаем в stream
(буквенная строка «привет», плюс два нулевых терминатора).
std::string hi = testStream.str();
Затем мы сравниваем две строки, используя operator ==
в классе std::string
. Этот оператор (вероятно) сравнивает длину string
объектов - включая количество конечных нулевых символов. Обратите внимание, что класс std::string
не требует, чтобы базовый массив символов заканчивался завершающим нулем - другими словами, он позволяет строке содержать нулевые символы, поэтому первый из двух конечных нулевых символов обрабатывается как часть строки hi
.
Поскольку две строки различаются по количеству завершающих нулей, сравнение не удается.
if( HELLO == hi )
{
std::cout << HELLO << "==" << hi << std::endl;
}
return 0;
}
Хотя, если распечатать или посмотреть на
в отладчике (VS2005), привет и привет
выглядят одинаково, их .length () в
факт отличается на 1. Это то, что я
угадывание вызывает оператор "=="
потерпеть неудачу.
Причина в том, что длина отличается на один завершающий нулевой символ.
Мой вопрос - почему? я не буду
понять, почему STD :: заканчивается
невидимый символ добавлен в строку
привет, привет и привет
длины, даже если у них есть
идентичный контент. Более того, это
невидимый персонаж не получает
отделан бустом Однако если
вы используете strcmp для сравнения .c_str () из
две строки, сравнение работает
правильно.
strcmp
отличается от std::string
- он записывается в первые дни, когда строки заканчивались нулем - поэтому, когда он достигает первого завершающего нуля в hi
, он перестает смотреть.
Причина, по которой я использовал std :: заканчивается в
первое место, потому что у меня были проблемы
в прошлом с потоком строк
сохранение данных мусора в конце
поток. STD :: заканчивается решено, что для
я.
Иногда полезно понять базовое представление.