Синтаксис Scanf - %6D и %-6D и %0D
-
24-10-2019 - |
Вопрос
Каковы различия между использованием scanf
со следующими спецификаторами формата, когда ввод сканируется 123456
по сравнению с тем, когда это 123
:
%6d
%-6d
%0d
Каковы различия в выводе?
Решение
Я закончил тем, что просто попробовал это с GCC 4.3.4 и получил следующее:
%6d
: Работает отлично; читает только 6 символов (поэтому, если вы попытаетесь прочитать123456789
он будет только читать123456
)%-6d
: Издает предупреждение:warning: unknown conversion type character '-' in format
Ничего не читает, и int, написанный для
%0d
: Издает предупреждение:warning: zero width in scanf format
Читает так, как будто в спецификаторе формата не было ширины (
%d
)
Я не проверил спецификацию, чтобы увидеть, являются ли эти результаты обязательными, или как GCC обрабатывает ее (РЕДАКТИРОВАТЬ: Андрейт нашел это)
Другие советы
А %-6d
является неверным спецификатором формата. Нет спецификаторов формата с -
в них в scanf
.
В %6d
а 6
часть называется максимальная ширина поля. Анкет Он работает со всеми спецификаторами формата (не только с d
) и указывает максимальное количество символов для чтения, прежде чем будет выполнено какое-либо специфическое преобразование формата. Например, если входная последовательность 1234567
, тогда %3d
будет читать и преобразовать 123
а также %6d
будет читать и преобразовать 123456
.
А %0d
является неверным спецификатором формата. Максимальная ширина поля в scanf
Должен быть ненулевое целое число (см. 7.19.6.2/3 в языковой спецификации).
Итак, это оставляет нас с %6d
в качестве единственного значимого спецификатора формата среди трех, которые вы предоставили. При этих обстоятельствах вопрос о различиях в выходе (в результатах?) Не имеет смысла.
РЕДАКТИРОВАТЬ: Возможно, можно утверждать, что в %-6d
а -6
часть - максимальная ширина поля, которая удовлетворяет стандартному требованию быть ненулевое десятичное целое число. Анкет Однако в языковой терминологии а Десятичное целое число В качестве лексического элемента представляет собой последовательность только цифр и цифр. Это не разрешено включать знак. Т.е. тоже -6
ни +6
десятичные целые числа. Каждый раз, когда вы используете -6
или же +6
Как целые числа в вашей программе это на самом деле нерашено -
а также +
Оператор Лекса, за которым следует десятичное целое число Lexeme. Итак, поскольку спецификация scanf
Требуется а ненулевое десятичное целое число Как максимальная ширина поля, это должно быть без знакового целого числа.
Вот что, я думаю, произойдет: %6D даст вам первые 6 цифр числа, %-6D, вероятно, не будет работать, как вы ожидаете, так как - это скорее спецификация выравнивания выпуска. %0D будет означать, что вам нужны только 0 символов, что, вероятно, не будет работать, как ожидалось.
Оба %-6d
а также %0d
находятся инвалид спецификации конверсии для scanf
, поэтому поведение для этих случаев будет неопределенный. Анкет Смотрите язык стандартный, § 7.19.6.2, ¶ 3.
Я предполагаю, как и Arkadiy, что вы действительно имели в виду форматирование в стиле Printf, так как вы ссылаетесь на «вывод». Я также предполагаю, что вы используете C (как предполагает тег).
Если вы бежите:
printf("%6d %-6d %0d", num1, num2);
... вы получите ошибки компилятора (или, что еще хуже, ошибки времени выполнения), так как вы не подали достаточно аргументов для трех форматов.
Я чувствую, что это не то, что вы спрашивали, хотя. Давайте предположим, что вы на самом деле бежите:
// (I've added some extra stuff to show how the formatting works.)
printf("'%6d'/'%-6d'/'%0d'", num2, num2, num2);
...ты получишь:
' 123'/'123 '/'123'
Обычно, если ширина поля (6 в данном случае) достаточно широкая, числа выравниваются правым, космическим. Если вы поместите «-» до ширины поля, они будут выровнены правыми, космическими.
Тонкость здесь находится в формате «%0d». Вы можете подумать, что вы указали поле с нулевой шириной ... и вы ошибетесь. Первое после того, как «%» - это флаг опции, а «0» - действительный флаг. Это означает, что «если ширина поля шире, чем содержание, левша с нулями». В этом случае вы не предоставили ширину поля («0» - это флаг, помните?), Таким образом, флаг «0» не имеет никакого эффекта: поле будет настолько широким, как требуется содержание.
Хотя есть еще худшая тонкость, хотя. Если вы указали «%-06D», вы получите правую укладку с нулями, верно? Гм, нет. Флаг «-» переопределяет флаг «0», какой бы заказ он поставлялся. Вы получите «123».