Странное поведение функции длины строки с нулевым символом?

У меня есть этот код сказать:

 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! Зачем?

1

Решение

Это потому что 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

4

Другие решения

Из документов:

string& append ( const char * s, size_t n );

Добавляет копию
строка, образованная первыми n символами в массиве символов
указал с.

string& append ( const char * s );

Добавляет копию
строка, образованная последовательностью символов с нулевым символом в конце (строка C)
указал с. Длина этой последовательности символов определяется
первое вхождение нулевого символа (как определено
traits.length (ы)).

Вторая версия (ваша первая) учитывает нулевой терминатор (который в вашем случае является именно первым символом). Первый нет.

3