Вопрос

Каковы различия между использованием 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».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top