У меня есть этот код сказать:
std::string str("ashish");
str.append("\0\0");
printf("%d", str.length());
Это печать 6, но если у меня есть этот код
std::string str("ashish");
str.append("\0\0",2);
printf("%d", str.length());
это печать 8! Зачем?
Это потому что str.append("\0\0")
использует нулевой символ для определения конца строки. Таким образом, «\ 0 \ 0» это длина ноль. Другая перегрузка, str.append("\0\0",2)
, просто берет длину, которую вы даете, поэтому он добавляет два символа.
Из стандарта:
basic_string& append(const charT* s, size_type n);
7 Требуется:
s
указывает на массив по крайней мереn
элементыcharT
,8 Броски: length_error, если size () + n> max_size ().
9 Последствия: Функция заменяет строку, контролируемую
*this
со строкой длиныsize() + n
чей первыйsize()
элементы являются копией исходной строки, контролируемой*this
и чьи оставшиеся элементы являются копией исходногоn
элементыs
,10 Возвращает:
*this
,basic_string& append(const charT* s);
11 Требуется:
s
указывает на массив по крайней мереtraits::length(s) + 1
элементыcharT
,12 Последствия: Вызовы
append(s, traits::length(s))
,13 Возвращает:
*this
,— [string :: append] 21.4.6.2 p7-13
Из документов:
string& append ( const char * s, size_t n );
Добавляет копию
строка, образованная первыми n символами в массиве символов
указал с.
string& append ( const char * s );
Добавляет копию
строка, образованная последовательностью символов с нулевым символом в конце (строка C)
указал с. Длина этой последовательности символов определяется
первое вхождение нулевого символа (как определено
traits.length (ы)).
Вторая версия (ваша первая) учитывает нулевой терминатор (который в вашем случае является именно первым символом). Первый нет.