Шрифт:
Примеры
Посмотрим, как эти модификаторы работают. Начнем с того, что продемонстрируем влияние модификатора ширины поля на печать целого числа. Рассмотрим следующую программу:
main
{
printf("/%d/\n", 336);
printf("/%2d/\n", 336);
printf("/%10d/\n", 336);
printf("/%-10d/\n", 366);
}
Эта программа печатает одно и то же значение четыре раза, но используются при этом четыре различные спецификации преобразования. Мы вводим также символы /, чтобы вы могли видеть, где начинается и кончается каждое поле. Результат выполнения программы выглядит следующим образом:
/336/ /336/
/ 336 /336 /
Первая спецификация преобразования %d не содержит модификаторов. Мы видим, что поле печати здесь имеет ширину, равную количеству цифр данного целого числа. Это так называемый выбор "по умолчанию", т. е. результат действия компилятора в случае, если вы не дали ему никаких дополнительных инструкций. Вторая спецификация преобразования - %2d. Она указывает, что ширина поля должна равняться 2, но, поскольку число состоит из трех цифр, доле автоматически расширяется до необходимого размера. Следующая спецификация %10d показывает, что ширина поля равна 10. И действительно, между символами / имеется семь пробелов и три цифры, причем число сдвинуто к правому краю поля. Последняя спецификация %-10d также указывает ширину поля, равную 10, а знак - приводит к сдвигу всего числа к левому краю, как показано в приведенном выше примере. Когда вы привыкнете к этой системе обозначений, она покажется вам простой и вы сумеeте по вашему усмотрению менять вид выходной информации.
Рассмотрим теперь некоторые форматы, соответствующие данным с плавающей точкой. Допустим, у нас имеется следующая программa:
main
{
printf(" /%f/\n" , 1234.56);
printf(" /%e/\n" , 1234.56);
printf(" /%4.2f/\n" , 1234.56);
printf(" /%3.1f/\n", 1234.56);
printf(" /%10.3f/\n" , 1234.56);
printf(" /%10.3e/\n" , 1234.56);
}
На этот раз результат работы программы будет выглядеть так
/1234.560059/
/1.234560E+03/
/1234.56/
/1234.6/
/ 1234.560/
/ 1.234E+03/
Мы снова начинаем с варианта, выбранного по умолчанию, т. е. сo спецификации %f. В этом случае имеется две величины, значене которых используются по умолчанию: ширина поля и число цифр справа от десятичной точки. Вторая величина задает шесть цифр, ширина поля берется такой, чтобы в нем могло поместиться число. Заметим, что печатаемое число несколько отличается от исходного. Это происходит потому, что на печать выводится 10 цифр, в то время как числа с плавающей точкой в нашей системе изображаются приблизительно с точностью до 6 или 7 цифр.
Рассмотрим вариант по умолчанию для спецификации %е. Как мы видим, при ее использовании печатается одна цифра слева от десятичной точки и шесть справа. В результате получается слишком много цифр! Чтобы избежать этого, необходимо задать число цифр справа от десятичной точки, и последние четыре опера тора программы реализуют как раз указанную возможность. Обратите внимание на то, как четвертый и шестой операторы производят округление выводимых данных.
Теперь исследуем некоторые варианты строк. Рассмотрим пример:
#define BLURB "Выдающееся исполнение"
main
{
printf(" /%2s/\n" , BLURB);
printf(" /'%25.s/\n" , BLURB);
printf(" /'%25.5s/\n" , BLURB);
printf(" /% - 25.5s/\n" , BLURB);
}
Boт результат работы программы:
/Выдающееся исполнение!/
/ Выдающееся исполнение!/
/ Выдаю/ /Выдаю /
Обратите внимание на то, как поле расширяется для того, чтобы поместились все указанные символы. Заметим также, как спецификация точности ограничивает число символов, выводимых на ПЕЧАТЬ. Символы .5 в спецификации формата указывают функции printf на необходимость напечатать только пять символов.
Теперь вы ознакомились с некоторым количеством примеров. А знаете ли вы, как подготовить оператор печати, чтобы напечатав нечто вроде следующей фразы:
Семья NAME, возможно, лишь на XXX.XX долларов богаче!
Здесь NAME и ХХХ.ХХ представляют значения соответствующих переменных в программе, скажем name[40] и cash. Вот одно из решений:
printf(" Семья %s, возможно, лишь на %.2f долларов