Подтвердить что ты не робот

Почему размер этого std::string изменяется при изменении символов?

У меня проблема, в которой размер строки выполняется с наличием символа '\0'. Я искал все в SO и не мог получить ответ.

Вот фрагмент.

int main()
{
  std::string a = "123123\0shai\0";
  std::cout << a.length();
}

http://ideone.com/W6Bhfl

В этом случае вывод

6

Где в качестве одной и той же программы с другой строкой, имеющей цифры вместо символов

int main()
{
  std::string a = "123123\0123\0";
  std::cout << a.length();
}

http://ideone.com/mtfS50

дает результат

8

Что именно происходит под капотом? Как поведение символа '\0' меняет поведение?

4b9b3361

Ответ 1

Последовательность \012 при использовании в строковом (или символьном) литерале - это восьмеричная escape-последовательность. Это восьмеричное число 12, которое соответствует символу ASCII linefeed ('\n').

Это означает, что ваша вторая строка фактически равна "123123\n3\0" (плюс фактический терминатор строки).

Было бы очень ясно, если вы попытаетесь распечатать содержимое строки.

Октальные последовательности длиной от одной до трех, и компилятор будет использовать как можно больше цифр.

Ответ 2

Если вы проверите раскраску на ideone, вы увидите, что \012 имеет другой цвет. Это потому, что это один символ, написанный в восьмеричном формате.