У меня проблема, при которой на размер строки влияет наличие символа '\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' меняет поведение?

26
samairtimer 8 Ноя 2016 в 10:30

2 ответа

Лучший ответ

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

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

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

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

47
Some programmer dude 8 Ноя 2016 в 15:15

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

12
Bo Persson 8 Ноя 2016 в 07:36