2016-11-08 2 views
26

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

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

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'?

+6

Не помещайте пустые символы (\ 0) в строки, если у вас нет очень хорошей идеи, что вы делаете и почему! – pjc50

+2

И если вам действительно нужны строки с нулевым завершением, вы захотите использовать 'std :: literals :: string_literals :: operator" "s' (C++ 14) или' std :: string (char * , size_t) '(не забудьте указать конечный нуль, если хотите). –

+2

Обратите внимание, что ваша вторая строка заменяет «shai» (четыре символа) на «123» (три символа), поэтому будет разница даже без восьмеричной последовательности, упомянутой в принятом ответе. –

ответ

48

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

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

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

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

+0

Бинго! Это съел мой разум, спасибо за ответ. – samairtimer

+0

Почему не первая длина строки 12, а вторая - 9? –

+0

... и почему вторая длина строки * больше *, чем первая? –

12

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

+2

Что * останавливает * восьмеричную последовательность внутри строки? –

+5

@Raw - либо длина последовательности, либо символ, который не может быть восьмеричной цифрой. Как s в '\ 0shai'. –

+1

Можно ли создать литерал с цифрами (0-7) следующих \ 0? только что-то вроде ''/0 "+" 12 "' (или, может быть, даже это не сработает?) – slawekwin

Смежные вопросы