Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
297.52 Кб
Скачать

Ввод-вывод Форматированный вывод

Сегодня мы рассмотрим две важные функции форматированного ввода и вывода. Устройство и работу этих функций полностью можно понять только после изучения работы с указателями и функций с переменным числом параметров. Но пользоваться этими функциями необходимо уже сейчас, так что некоторые моменты придётся пропустить.

Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ (Ошибочная последовательность байтов).

int printf (const char * format, ...);

#include <stdio.h>

#include <conio.h>

void main() {

//функция не получает никаких аргументов, кроме строки

printf("Hello world");

getch();

}

Функция проходит по строке и заменяет первое вхождение %<спецификатор формата> на первый аргумент, второе вхождение %<спецификатор формата> на второй аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.

Общий синтаксис спецификатора формата

%[флаги][ширина][.точность][длина]спецификатор

Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.

Спецификатор

Что хотим вывести

Пример

d или i

Целое со знаком в десятичном виде

392

u

Целое без знака в десятичном виде

7235

o

Беззнаковое в восьмеричном виде

657

x

Беззнаковое целое в шестнадцатеричном виде

7fa

X

Беззнаковое целое в шестнадцатеричном виде, верхний регистр

7FA

f или F

Число с плавающей точкой

3.4563745

e

Экспоненциальная форма для числа с плавающей точкой

3.1234e+3

E

Экспоненциальная форма для числа с плавающей точкой, верхний регистр

3.1234E+3

g

Кратчайшее из представлений форматов f и e

3.12

G

Кратчайшее из представлений форматов F и E

3.12

a

Шестнадцатеричное представление числа с плавающей точкой

-0xc.90fep-2

A

Шестнадцатеричное представление числа с плавающей точкой, верхний регистр

-0xc.90FEP-2

c

Буква

a

s

Строка (нуль-терминированный массив букв)

Hello World

p

Адрес указателя

b8000000

n

Ничего не пачатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n

%

Два идущих друг за другом процента выводят знак процента

%

Примеры

#include <stdio.h>

#include <conio.h>

void main() {

int a = 0x77, b = -20;

char c = 'F';

float f = 12.2341524;

double d = 2e8;

char* string = "Hello, World!";

printf("%s\n", string);

printf("a = %d, b = %d\n", a, b);

printf("a = %u, b = %u\n", a, b);

printf("a = %x, b = %X\n", a, b);

printf("dec a = %d, oct a = %o, hex a = %x\n", a, a, a);

printf("floating point f = %f, exp f = %e\n", f, f);

printf("double d = %f or %E\n", d, d);

printf("not all compiler support %a\n", f);

printf("character c = %c, as number c = %d", c, c);

printf("address of string is %p", string);

getch();

}

Строка формата также может включать в себя следующие необязательные суб-спецификаторы:

  • флаг,

  • ширина,

  • .точность и

  • модификатор (именно в таком порядке).

Флаг

Описание

-

Выключка влево на заданное шириной значение

+

Явно указывать знак у числа, даже для положительных чисел

(пробел)

Если знак не будет выведен, то вставляет пробел перед выводимым числом

#

Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X. Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков

0

Вставляет нули, когда объявлен спецификатор ширины

Ширина

Описание

(число)

Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули)

*

Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

Точность

Описание

.число

Для спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче, то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится.

Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6).

Для g и G - это число значащих разрядов, которые необходимо вывести.

Для s - выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого.

Если число не стоит, то по умолчанию точность равна 0

.*

Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

Примеры

#include <stdio.h>

#include <conio.h>

void main() {

int a = 0x77, b = -20;

char c = 'F';

float f = 12.2341524;

double d = 2e2;

char* string = "Hello, World!";

printf("%.3f\n", f);

printf("%.*f\n", 2, f);

printf("%010.3f\n", d);

printf("%*d\n", 6, a);

printf("%+d\n", b);

printf("%0.6d\n", a);

printf("%.f\n", d);

printf("%.4s", string);

getch();

}

Суб-спецификатор длины изменяет длину типа. В случае, если длина не совпадает с типом, по возможности происходит преобразование до нужного типа.

Спецификаторы

Длина

d, i

u o x X

f F e E g G a A

c

s

p

n

(none)

int

unsigned int

double

int

char*

void*

int*

hh

signed char

unsigned char

signed char*

h

short int

unsigned short int

short int*

l

long int

unsigned long int

wint_t

wchar_t*

long int*

ll

long long int

unsigned long long int

long long int*

j

intmax_t

uintmax_t

intmax_t*

z

size_t

size_t

size_t*

t

ptrdiff_t

ptrdiff_t

ptrdiff_t*

L

long double

Примеры

#include <stdio.h>

#include <conio.h>

void main() {

long long x = 12300000000579099123;

short i = 10;

printf("%llu\n", x);

printf("%d\n", i);

printf("%hd\n", i);

getch();

}