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

Понимание вывода printf, содержащего обратную косую черту (\ 012)

Не могли бы вы помочь мне понять вывод этого простого кода:

const char str[10] = "55\01234";
printf("%s", str);

Вывод:

55
34
4b9b3361

Ответ 1

Последовательность символов \012 внутри строки интерпретируется как восьмеричная escape-последовательность. Значение 012, которое интерпретируется как восьмеричное, равно 10 в десятичном значении, которое является символом строки (\n) на большинстве терминалов.

Со страницы Википедии:

Октальная escape-последовательность состоит из \, за которой следует одна, две или три восьмеричные цифры. Октальная escape-последовательность заканчивается, когда она либо содержит три восьмеричные цифры, либо следующий символ не является восьмеричной цифрой.

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

Таким образом, вы могли бы написать свою строку как "55\n34", что более ясно, что вы видите, и которая будет более переносимой, поскольку она больше не жестко кодирует новую строку, а вместо этого позволяет компилятору сгенерировать что-то подходящее.

Ответ 2

\012 является escape-последовательность, которая представляет octal код символа:

012 = 10 = 0xa = LINE FEED (in ASCII)

Итак, ваша строка выглядит как 55[LINE FEED]34.

LINE FEED символ интерпретируется как последовательность новых строк на многих платформах. Вот почему вы видите две строки на терминале.

Ответ 3

\012 - это новая строка escape-последовательности, как уже указывалось ранее. (Что может быть, поскольку chux абсолютно корректно прокомментирован, отличается, если ASCII не является используемой кодировкой. Но в любом случае в этом обозначении будет восьмеричная цифра.)

это подразумевается стандартом, поскольку он говорит для c99 в ISO/IEC 9899

для

6.4.4.4 Символьные константы

[...]

3 Одинарная кавычка, двойная кавычка, вопросительный знак?, обратная косая черта\и произвольные целочисленные значения представляются в соответствии со следующей таблицей эвакуации последовательности:

одиночная кавычка '\'

двойная кавычка "\"

знак вопроса? \?

обратная косая черта \\

восьмеричный символ\восьмеричные цифры

шестнадцатеричный символ \x шестнадцатеричные цифры

И диапазон, к которому он привязан:

Ограничения

9 Значение восьмеричной или шестнадцатеричной escape-последовательности должно находиться в диапазоне представляемые значения для типа unsigned char для целочисленной символьной константы или неподписанный тип, соответствующий wchar_t для широкой константы символов.