Форматированный консольный ввод-вывод
Стандартная библиотека С содержит две функции, выполняющие форматированный ввод и вывод стандартных типов данных: printf() иscanf(). Термин форматированный подразумевает, что эти функции могут писать и читать данные в разных форматах, которыми можно управлять. Функцияprintf() используется для вывода данных на консоль,scanf() – для чтения данных с консоли. Какprintf(), так иscanf() могут работать с любыми стандартными типами и строками.printf( )имеет следующий прототип:intprintf(constchar*форматная строка, …);
Первый аргумент форматная строкаопределяет способ вывода последующих аргументов. Он содержит два типа элементов: символы, выводимые на экран, и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. Спецификаторы формата начинаются со знака процент, за которым следует код формата.
Код %c %d %i %e %E %f %lf %g
%G
%o %s %u %x %X %p %n
%% |
Формат Символ Знаковое десятичное целое число Знаковое десятичное целое число Научная нотация (e– строчная) Научная нотация (E– прописная) Десятичное число с плавающей точкой Десятичное число с плавающей точкой двойной точности Использует или %e, или %f, соответствующее более короткому представлению Использует или %E, или %f, соответствующее более короткому представлению Беззнаковое восьмеричное число Строка символов Беззнаковое десятичное число Беззнаковое шестнадцатиричное число (строчные буквы) Беззнаковое шестнадцатиричное число (прописные буквы) Вывод указателя Ассоциированный аргумент – это указатель на целое, в которое записывается число уже выведенных символов Выводит знак % |
Должно быть полное соответствие между числом аргументов и числом спецификаторов формата, а также спецификаторы формата и аргументы должны соответствовать друг другу.
Функция printf( )возвращает число напечатанных символов. В случае ошибки она возвращаетEOF.
Печать символов
Для печати отдельных символов используется %c. Для печати строки %s.
Вывод чисел
Пример
#include <stdio.h>
int main(void)
{
double f;
for(f=1.0; f<1.0e+10; f=f*10)
printf("%g ", f);
getchar();
unsigned int num;
for(num=0; num<255; num++) {
printf("%o ", num);
printf("%x ", num);
printf("%X ", num);
}
getchar();
return 0;
}
Вывод адресов
Пример
#include <stdio.h>
int main(void)
{
/* Вывод адресов */
int sample;
printf("%p ", &sample);
getchar();
return 0;
}
Спецификатор %n Пример
#include <stdio.h>
int main(void)
{
int sample; /* Спецификатор %n */
printf("This%n is a test\n", &sample);
printf("%d\n", sample);
getchar();
return 0;
}
Опциональные префиксы для целых чисел
Код |
Значение |
h |
Короткое целое short |
l |
Длинное целое long |
ll |
Дважды длинное целое longlong |
I32 |
Тип __int32 |
I64 |
Тип __int64 |
Модификаторы формата
Спецификатор минимума ширины поля
Целое число, помещаемое между знаком % и кодом формата, рассматривается как спецификатор минимума ширины поля.
Пример
#include <stdio.h>
int main(void)
{
double item;
item = 10.12304;
printf(“%f\n”, item);
printf(“%10f\n”, item);
printf(“%012f\n”,item);
return0;
}
Спецификатор точности
Спецификатор точности состоит из точки, за которой следует целое число.
#include <stdio.h>
int main(void)
{
printf(“%.4f\n”, 123.1234567);
printf(“%3.8d\n”, 1000);
printf(“%10.15s\n”, “This is a simple test”);
return0;
}
В результате получим
123.1235 00001000 Thisisasimpl
Выровненый вывод
Модификаторы * и #
Помещение # перед g, G, f, e или E обеспечивает наличие десятичной точки в случае отсутствия дробной части. Если перед спецификатором o поместить #, то выведенное число будет иметь в начале 0. Если перед спецификаторами формата x или X поставить #, то шестнадцатеричное число будет печататься с префиксом 0x. Нельзя применять # к другим спецификаторам формата.
Помимо констант, спецификаторы минимальной ширины поля и точности могут предоставляться аргументами printf(). Для реализации этого следует использовать *.
printf(“%*.*f”, 10, 4, 123.4)
scanf( )
Стандартный ввод с консоли, как правило, осуществляется с помощью scanf(). Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Стандартный видscanf() следующий: