Управляющая строка

Управляющая строка состоит из текста и спецификаций. Каждая спецификация определяет только одно передаваемое значение.

Формат одной спецификации:

%[<флаги>][W][.D][l]<тип>

Флаги для функции printf (для функции scanf они не используются):

- данное прижимается к левой границе поля вывода, если выводи-

мое значение имеет меньше символов, чем размер поля вывода;

+ число всегда выводится со знаком;

<пробел> вместо знака числа: <пробел> для чисел > 0, - для чисел <0.

W – размер поля данного в символах (байтах).

D – обычно характеризует точность представления значения при выводе, при вводе не используется.

l– модификатор длинных значений; употребляется при передаче значений типа long и double.

<тип> - это собственно спецификация, определяющая тип передаваемого значения.

6.1.1. Спецификация d (целые десятичные числа)

Ввод. Формат спецификации: %[W][l]d

Значения при вводе разделяются символами разрядки. Если до появления символа разрядки будет считано W символов и в спецификации присутствует параметр W, то ввод данного значения закончится.

W – максимальное число считываемых символов.

Пример.

Внешнее представление Спецификация Значение в памяти

165<пробел> d 165

-165<Tab> d -165

+165<Enter> d 165

165 2d 16

165 1d 1

431921 ld 431921

-431921 4ld -431

+431921<пробел> 10ld 431921

Вывод. Формат спецификации: %[<флаги>][W][.D][l]d, где D – минимальное число выводимых символов. Если длина выводимого значения превышает W символов, то действие параметра W игнорируется и значение выводится полностью. Если его длина меньше Wсимволов, то выводимое значение располагается в крайних правых позициях поля вывода. Если при этом использован флаг -, то значение располагается в крайних левых позициях поля. Если длина значения меньше Dсимволов, то значение дополняется слева нулями.

Пример.

Значение в памяти Спецификация Внешнее представление

2475 d 2475

2475 +d +2475

2475 <пробел>d <пробел>2475

-2475 d -2475

-2475 +d -2475

-2475 <пробел>d -2475

-2475 3d -2475

2475 10d ______2475

2475 +10d _____+2475

2475 -10d 2475______

2475 -+10d +2475_____

2475 10.4d ______2475

-12 10.4d ______-012

-12 .4d -012

-12 .0d -12

3 5.0d ____3

-478126 10ld ___-478126

-478126 -10ld -478126___

478126 +-10ld +478126___

6.1.2. Спецификация f (десятичные числа с плавающей точкой)

Ввод. Формат спецификации: %[W][l]f .

Форма представления одного значения:

[+|-][a][.b][<порядок>] , где aцелая часть, b – дробная часть.

<порядок>:= [e|E][+|-]<целое без знака>

Длина мантиссы >= 1 цифры.

Вводимое значение может представляться как в обычной, так и в показательной форме. Очевидно, что какая-то из необязательных опций должна присутствовать. Для значений в показательной форме символ e (10 в степени) можно не задавать. Тогда необходимо задать знак числа.

Пример.

Внешнее представление Спецификация Значение в памяти

-2.347e-5 f -2.347e-5

-236.485 f -2.36485e+2

2e10 f 2e10

.345 f 0.345

-2. f -2.0

461.2347 %5f%3f 461.2 347

-94.56e-5 f -9.456e-4

-94.56+5 f -9.456e+6

 

Вывод.Значение выводится в обычной форме.

Формат спецификации: %[W] [.D][ l ] f, гдеD – число знаков после символа десятичной точки.

По умолчанию D=6. При D=0 десятичная точка не выводится. Если число дробных разрядов больше D, то результат округляется, если меньше, то значение дополняется справа нулями. Значение, как при спецификации d, выводится полностью, что при неправильной оценке величины выводимого значения приводит к очень длинным числам.

Пример.

Значение в памяти Спецификация Внешнее представление

-385.476 f -385.476000

2. f 2.000000

1e-7 f 0.000000

1e15 f 1000000000000000.000000

-385.476 10f -385.476000

-385.476 15f ____-385.476000

2.5 10.4f ____2.5000

-6.48756 10.4f ___-6.4876

-0.34844 6.4f -0.3484

38.56 .0f 39

0.000346 10.5f ___0.00035

6.1.3. Спецификация e (десятичные числа с плавающей точкой)

Ввод. Полностью аналогичен спецификации f, поэтому для ввода ее можно не использовать.

Вывод. Значение выводится в показательной форме в нормализованном виде (преобразуется так, чтобы мантисса находилась в пределах 1<=|m|<10).

Формат спецификации: %[W][.D]{e|E}, где D–количество значащих цифр мантиссы. По умолчанию D=6. При D=1 точка не выводится. Если в спецификации использована заглавная буква E, то в выводимом значении также ставится заглавный символ E (10 в степени). Остальные правила совпадает со спецификацией f.

Пример.

Значение в памяти Спецификация Внешнее представление

2.3 e 2.30000e+00

2.3 .5e 2.3000e+00

237.486 10.4e _2.375e+02

237.486 10.4E _2.375E+02

-96.56e-105 15.5e ___-9.6560e-104

2.37e25 10.1e _____2e+25

-24.866e-10 .4e -2.487e-09

6.1.4. Спецификация g (универсальная спецификация)

С помощью этой спецификации можно вводить и выводить любые числовые значения. Формат спецификации gаналогичен формату спецификации e. Эту спецификацию удобно использовать для вывода значений с плавающей точкой, когда неизвестен диапазон выводимых значений. Если значение лежит в диапазоне 104<=|x|<10D, где D – параметр спецификации, то оно будет выводиться по спецификации f, если значение вне указанного диапазона, то по спецификации e. Это дает возможность всегда получать внешнее представление значения приемлемой длины. При этом конечные нули не выводятся. Если использовать заглавную букву G, то при выводе в показательной форме будет применяться заглавная буква E в представлении порядка.

Рекомендация по вводу-выводу числовых значений. Для ввода-вывода целых значений следует использовать спецификацию d. Для ввода значений с плавающей точкой любой величины достаточно спецификации f. Если значения с плавающей точкой по модулю невелики(или немалы), разумно применять спецификацию f, в противном случае – спецификацию g. Спецификацию e можно вообще не использовать.


Пример.

Значение в памяти Спецификация Внешнее представление

0.000485456 .5g 0.00048546

4.456e-5 .5g 4.456e-05

4.456 .5g 4.456

4.456e4 .5g 44560

4.456e6 .5g 4.456e+06

0.0004456 .5g 0.0004456

4.456e6 .5G 4.456E+06