- •1. Введение.
- •2. Общие положения.
- •3. Форматирование ввода-вывода средствами языка с
- •4. Функция printf()
- •6. Оператор printf - вывод целых чисел в восьмиричном и
- •10. Оператор printf - вывод значений типа char
- •11. Оператор printf - вывод чисел с плавающей точкой в
- •12. Оператор printf - вывод чисел с плавающей точкой в
- •13. Оператор printf - вывод текстовых строк
- •15. Оператор printf - вывод значений со знаком
- •16. Оператор printf - форматирование вывода целого значения
- •18. Оператор printf - вывод префикса перед восьмиричными и
- •19 . Оператор printf - форматирование чисел с плавающей точкой
- •20. Оператор printf - форматирование экспоненциального представления
- •21. Оператор printf - вывод с выравниванием слева
- •22. Оператор printf - комбинирование спецификаторов формата
- •23. Оператор printf - перенос символьной строки
- •24. Оператор printf - вывод текстовых строк по near- и far-указателям
- •25. Оператор printf - работа с Esc-символами
- •26. Оператор printf - определение количества выводимых символов
- •27. Оператор printf - использование возвращаемого значения
- •28. Ansi-драйвер
- •29. Использование ansi-драйвера для очистки экрана
- •30. Использование ansi-драйвера для управления цветом на экране
- •31. Использование ansi-драйвера для позиционирования курсора
- •33.Ввод и вывод одного символа
- •35.Буферы
- •36. Чтение одной строки
- •37. Функции ввода-вывода символов
3. Форматирование ввода-вывода средствами языка с
Начнем наше изучение функций printf() и scanf() с того, что определим для чего они нам нужны. Функции printf() и scanf() используются для ввода и вывода информации. Точнее, функция printf() заведует выводом, а функция scanf() - вводом. Эти две функции очень похожи между собой, поэтому рассмотрим сначала функцию printf(), а после перейдем к изучению scanf().
Кстати, чтобы работать с этими функциями без проблем, не забывайте подключать в своих приложениях библиотеку stdio.h
4. Функция printf()
Как уже упоминалась ранее, функция printf() является функцией вывода. Рассмотрим прототип данной функции:
int printf(const char *control-str[, argument1 [, argument2 [, ... ]]]);
Начнем с того, что же эта функция возвращает. А возвращает она при удачном стечении обстоятельств количество выведенных символов, в противном случае вернет код ошибки.
Параметр control-str (управляющая строка) - это строка в двойных кавычках. Данный параметр может быть единственным в функции. Например:
строка кода
printf("Нello, everybody! \nIt's me again.");
выведет на экран
Hello, everybody!
It's me again.
Параметры argument1, argument2 и т.д. - это те элементы, которые необходимо вывести на экран. Они могут быть переменными или константами либо даже выражениями, значение которых вычисляется при выводе на печать.
Если в функции есть хотя-бы один параметр argument, управляющая строка должна содержать спецификатор преобразования для него. Для каждого параметра argument необходим спецификатор преобразования. Сами спецификаторы перечислены в таблице.
Спецификатор
преобразования Результат
%c одиночный символ
%d десятичное целое число
%e число с плавающей точкой, экспоненциальное представление (e-представление)
%E число с плавающей точкой, экспоненциальное представление (E-представление)
%f число с плавающей точкой, десятичное представление
%g использует %f или %e, в зависимости от значения. %e используется, если показатель
экспоненты меньше чем -4 или больще либо равен заданной точности
%G использует %f или %E, в зависимости от значения. %E используется, если показатель
экспоненты меньше чем -4 или больше либо равен заданной точности
%i десятичное целое число со знаком
%o восьмеричное целое число без знаков
%p указатель
%s строка символов
%u десятичное целое число без знака
%x шеснадцатиричное целое число без знака, использование шеснадцатиричных цифр от
0 до f
%X шеснадцатиричное целое число без знака, использование шеснадцатиричных цифр от
0 до F
%% печать знака процента
Элементы, которые необходимо вывести на экран, нужно расположить в функции в таком порядке, в каком в управляющей строке расположены для них спецификаторы преобразования. Это связано с работой функции printf(). Функция выводит без изменений все символы управляющей строки за исключением спецификаторов преобразования. Когда функция находит в управляющей строке первый спецификатор преобразования, она подставляет значение второго параметра (т.е. argument1)на место спецификатора, предварительно преобразовав это значение в соответствии с данным спецификатором. Далее, найдя следующий спецификатор, функция подставляет на его место третий параметр и так далее. Рассмотрим примеры:
int numPages = 273;
printf("The book has %d pages.", numPages);
выведет на экран
The book has 273 pages.
float nQuantity = 100;
printf("They have eaten only %f%% from %d kilograms of food\n", \nQuantity/3 , 25);
выведет на экран
They have eaten only 33.333333% from 25 kilograms of food.
Согласитесь, в последнем примере цифры, выведенные на экран, выглядят не очень красиво. Возникает вопрос - что же с ними делать? Для того, чтобы исправить сложившееся положение при помощи функции printf(), необходимо рассмотреть как выглядит полностью прототип спецификатора преобразования. На самом деле спецификатор преобразования -это не только знак процента с определенной буквой. Спецификатор имеет несколько необязательных параметров и выглядит он следующим образом:
%[flags] [width] [.precision] [{h | l | L}]type
В данном прототипе type - это как раз те буквы, которые мы рассмотрели ранее. До этого момента мы использовали, так скажем, упрощенные спецификаторы преобразования, то есть в нашем случае прототип выглядел бы так:
%type
Что тоже является правильным, правда, не всегда удобным. Чтобы понять, зачем нужны спецификатору преобразования необязательные параметры, рассмотрим их по порядку. И начнем наше рассмотрение с первого необязательного параметра - flags. Все существующие флаги приведены в таблице. Сразу необходимо отметить, что в спецификаторе могут применяться сразу несколько флагов.
Флаг Значение
элемент со значением выравнивания по левому краю; т. е. содержимое будет
напечатано, начиная с левого края
значения со знаком "плюс", если они положительны, и со знаком "минус", если они
отрицательны
Пробел значения со знаком "плюс" печатаются с пробелом (но без знака), если они
положительны, и со знаком "минус", если они отрицательны. Флаг "+"
отменяет появление пробела в начале
# использует альтернативную форму для спецификации преобразования. Выводит в
начале 0 для формы %о и 0x или 0X для форм %x и %X. Для всех форм с плавающей
точкой # гаран
0 для числовых форм заполняет поле по ширине нулями вместо пробелов. Этот флаг
игнорируется, если прсутствует флаг "-" или если указана точность для целочислен-
ной формы
Рассмотрим несколько примеров с использованием флагов:
int books = 10;
printf("In my library %+d booksn", books);
выведет на экран
In my library +10 books
int count = 923;
printf( "Decimal %d as:ntHex: %X hex: %x Octal: %on",
count, count, count, count );
printf( "Decimal % d as:ntHex: %#X hex: %#x Octal: %#on",
count, count, count, count );
выведет на экран
Decimal 923 as:
Hex: 39B hex: 39b Octal: 1633
Decimal 923 as:
Hex: 0X39B hex: 0x39b Octal: 01633
width - минимальная ширина поля. Более широкое поле будет использоваться, если выводимое число или строка не будет соответствовать полю. Пример:
int num = 345;
printf("'%d'n", num);
printf("'%2d'n", num);
printf("'%8d'n", num);
printf("'%-8d'n", num);
выведет на экран
'345'
'345'
' 345'
'345 '
.precision - точность. Для преобразований %e, %E и %f задается количество цифр, которые будут выведены справа от десятичного числа. Для преобразований %g и %G задается максимальное число значащих цифр. Для преобразования %s задается максимальное число символов, которое будет напечатано. Для преобразований целого числа задается минимальное число цифр, которые должны появиться; если целое число содержит меньше цифр, чем задано, то в начало числа добавляются нули. При использовании точки (.) подразумевается следующий далее нуль, так что %.f - тот же спецификатор, что и %.0f. Приведем пример:
float nQuantity = 100;
printf("They have eaten only %.1f%% from %d kilograms of food\n",
\nQuantity/3 , 25);
printf("They have eaten only %03.f%% from %.4d kilograms of food\n",
\nQuantity/3 , 25);
выведет на экран
They have eaten only 33.3% from 25 kilograms of food
They have eaten only 033% from 0025 kilograms of food
Если вместо числа в модификаторе width поставить звездочку (*), то для данного спецификатора не будет задана фиксированная ширина поля, а ширину будет регулировать переменная (целое число). То же самое касается точности - если вместо числа в модификаторе precision поставить *, то за количество знаков после запятой будет отвечать переменная. Пример:
float num = 12.5;
int width = 7; //отвечает за ширину поля
int precision = 3;//отвечает за точность
printf("%0*.*f", width, precision, num);
выведет на экран
012.500
h | l | L -необязательные префиксы, приставляемые к типу спецификатора модификации. Они уточняют размер параметра argument, относящегося к данному спецификатору. h используется при целочисленном преобразовании для кодирования значений short int или unsigned short int. l используется при целочисленном преобразовании для кодирования значений long int или unsigned long int. L используется для преобразований с плавающей точкой для кодирования значений long double.
5. Оператор printf - вывод значений типа int
Функция printf поддерживает спецификаторы формата, обеспечивающие ее информацией о типах параметров (таких как int, char и т.д.). Для отображения с помощью printf значений типа int следует использовать спецификатор формата %d. В следующей программе INTOUT.C для значений типа int используется спецификатор формата %d:
#include <stdio.h>
void main()
{
int age = 41;
int height =73;
int weight = 165;
printf(Возраст пользователя: %d вес: %d рост: %d\n ", age,weight, height);
printf ("%d плюс %d равно %d\n ", 1, 2, 1+2);
}
После компиляции и выполнения программы на экран будет выведено:
Возраст пользователя: 41 вес: 165 рост: 73
1 плюс 2 равно 3
Примечание: Многие Си-компиляторы рассматривают спецификатор формата %i как идентичный °/od. Однако при написании новой программы рекомендуется использовать спецификатор %d.