Многие программы читают только из одного входного потока и пишут только в один выходной поток. Для организации ввода-вывода таким программам вполне хватит функций getchar , putchar и printf , а для начального обучения уж точно достаточно ознакомления с этими функциями. В частности, перечисленных функций достаточно, когда требуется вывод одной программы соединить с вводом следующей. В качестве примера рассмотрим программу lower , переводящую свой ввод на нижний регистр:
#include ‹stdio.h›
#include ‹ctype.h›
main() /* lower: переводит ввод на нижний регистр */
{
int с;
while ((с = getchar()) != EOF)
putchar(tolower(c));
return 0;
}
Функция tolower определена в ‹ctype.h›. Она переводит буквы верхнего регистра в буквы нижнего регистра, а остальные символы возвращает без изменений. Как мы уже упоминали, "функции" вроде getchar и putchar из библиотеки ‹stdio.h›и функция tolower из библиотеки ‹ctype.h›часто реализуются в виде макросов, чтобы исключить накладные расходы от вызова функции на каждый отдельный символ. В параграфе 8.5 мы покажем, как это делается. Независимо от того, как на той или иной машине реализованы функции библиотеки ‹ctype.h›, использующие их программы могут ничего не знать о кодировке символов.
Упражнение 7.1. Напишите программу, осуществляющую перевод ввода с верхнего регистра на нижний или с нижнего на верхний в зависимости от имени, по которому она вызывается и текст которого находится в arg[0] .
7.2 Форматный вывод (printf)
Функция printfпереводит внутренние значения в текст.
int printf(char *format, arg 1, arg 2, …)
В предыдущих главах мы использовали printf неформально. Здесь мы покажем наиболее типичные случаи применения этой функции: полное ее описание дано в приложении B.
Функция printf преобразует, форматирует и печатает свои аргументы в стандартном выводе под управлением формата. Возвращает она количество напечатанных символов.
Форматная строка содержит два вида объектов: обычные символы, которые напрямую копируются в выходной поток, и спецификации преобразования, каждая из которых вызывает преобразование и печать очередного аргумента printf . Любая спецификация преобразования начинается знаком %и заканчивается символом-спецификатором . Между % и символом-спецификатором могут быть расположены (в указанном ниже порядке) следующие элементы:
• Знак минус, предписывающий выравнивать преобразованный аргумент по левому краю поля.
• Число, специфицирующее минимальную ширину поля. Преобразованный аргумент будет занимать поле по крайней мере указанной ширины. При необходимости лишние позиции слева (или справа при левостороннем расположении) будут заполнены пробелами.
• Точка, отделяющая ширину поля от величины, устанавливающей точность.
• Число (точность), специфицирующее максимальное количество печатаемых символов в строке, или количество цифр после десятичной точки - для чисел с плавающей запятой, или минимальное количество цифр - для целого.
• Буква h, если печатаемое целое должно рассматриваться как short, или l (латинская буква ell), если целое должно рассматриваться как long.
Символы-спецификаторы перечислены в таблице 7.1. Если за %не помещен символ- спецификатор, поведение функции printf будет не определено. Ширину и точность можно специфицировать с помощью *; значение ширины (или точности) в этом случае берется из следующего аргумента (который должен быть типа int ). Например, чтобы напечатать не более max символов из строки s , годится следующая запись:
printf("%.*s", max, s);
Таблица 7.1 Основные преобразования printf
Символ |
Тип аргумента; вид печати |
d, i |
int; десятичное целое |
o |
unsigned int; беззнаковое восьмеричное ( octal ) целое (без нуля слева) |
x, |
X unsigned int; беззнаковое шестнадцатеричное целое (без 0x или 0X слева), для 10…15 используются abcdef или ABCDEF |
u |
unsigned int; беззнаковое десятичное целое |
c |
int; одиночный символ |
s |
char *; печатает символы, расположенные до знака \0, или в количестве, заданном точностью |
f |
double; [-]m.dddddd, где количество цифр dзадается точностью (по умолчанию равно 6) |
e, E |
double; [-]m.dddddde+xxили [-]m.ddddddE+xx, где количество цифр dзадается точностью (по умолчанию равно 6) |
g, G |
double; использует %eили %E, если порядок меньше, чем -4, или больше или равен точности; в противном случае использует %f. Завершающие нули и завершающая десятичная точка не печатаются |
p |
void *; указатель (представление зависит от реализации) |
% |
Аргумент не преобразуется; печатается знак % |
Большая часть форматных преобразований была продемонстрирована в предыдущих главах. Исключение составляет задание точности для строк. Далее приводится перечень спецификаций и показывается их влияние на печать строки "hello, world", состоящей из 12 символов. Поле специально обрамлено двоеточиями, чтобы была видна его протяженность.
Читать дальше