218.03K
Категория: ПрограммированиеПрограммирование

Функции ввода/вывода языка С (работа со стандартными потоками). Тема 8

1.

Тема 8.
Функции ввода/вывода языка С
(работа со стандартными потоками)
Факультет электротехники и автоматики

2.

Системная библиотека С
Ввод-вывод
(stdio.h)
Работа с
памятью и
строками
(string.h)
Библиотечные
функции
Математические
функции
(math.h)
Управление
выполнением
(stdlib.h)
Функции
времени
(time.h)
Системная библиотека С предоставляет программисту
широкий
набор
функций,
предназначенных
для
выполнения в программах типовых действий.
2

3.

Чтение и запись по символам
Функции getchar применяется для чтения отдельных
символов из стандартного потока ввода stdin, а функция
putchar – для записи в стандартный поток stdout.
//getchar читает один символ из стандартного
//потока (stdin),как правило, это клавиатура
int getchar(void);
//putchar выводит один символ в стандартный
//поток(stdout), как правило, это дисплей
//в случае успеха возвращает выведенный символ
int putchar(int c);
3

4.

Пример посимвольного ввода/вывода
4
Пример кода
//копирование введенного текста из стандартного
//потока ввода (клавиатура), в стандартный
//поток вывода (дисплей)
//getchar приостанавливает работу программы,
//пока не будет нажата клавиша Enter
int c;
//getchar читает по одному символу
//пока не встретит символ переноса строки '\n‘
while ((c = getchar()) != '\n')
putchar(c);
//вывод символа на дисплей

5.

Чтение и запись по строкам
Функции gets применяется для чтения текстовых строк из
стандартного потока ввода stdin, а функция puts – для
записи в стандартный поток stdout.
//gets читает строку из stdin и помещает ее по
//адресу buf, если встретит символ новой строки,
//то прекращает чтение; возвращает указатель на
//прочитанную строку заканчивающуюся нулем
char* gets(char *buf);
//puts копирует строку, заканчивающуюся нулем,
//в stdout; в случае успеха возвращает
//неотрицательное значение
int puts(char *buf);
5

6.

Пример ввода/вывода по строкам
6
//массив для резервирования места под строку
char name[15];
puts("введите имя");
//вывод на экран сообщения
gets(name);
//ввод строки
puts(name);
//вывод на экран введенной строки
В данном примере функция gets небезопасна, если
введенная строка будет содержать более 14 символов. Для
предотвращения
переполнения
массива
следует
использовать функции проверяющие размер вводимой строки
fgets(name, 15, stdin);
или
gets_s(name, 15);
//добавляет в конце \n
//для С14++ и выше

7.

Форматированный вывод
7
Функция printf выводит в стандартный поток вывода строку,
отформатированную
в
соответствии
с
правилами,
указанными в строке format. В случае успеха возвращает
количество выведенных байт.
int printf (const char* format [, аргумент, ...]);
Текстовые данные
Формат
Двоичные данные
char
short
Преобразование
экран
long
double
Строка форматирования читается слева направо. Правила
задаются набором трех типов директив:
1. Спецификаторы формата;
2. Специальные символы;
3. Обычные символы (кроме '%' и '\') выводятся без изменения;

8.

Спецификаторы формата printf
Каждый спецификатор начинается со знака процента %.
После % идут компоненты формата в следующем порядке:
%[флаги][ширина][.точность][модификаторы]тип
Компонент
Назначение
Опция
флаги
Выравнивание, знак +
ширина
Минимальное число символов поля необязат.
точность
Число знаков после десятичной
точки, а для целых – минимальное необязат.
число выводимых цифр
модификатор Уточняет размер типа переменной
тип
Тип переменной
необязат.
необязат.
обязател.
8

9.

Типы преобразования
Тип
Назначение
d,i
Знаковое десятичное целое
o
Беззнаковое восьмеричное целое
u
Беззнаковое десятичное целое
x, X
Беззнаковое шестнадцатеричное целое
f
Знаковое число в формате с плавающей точкой
e, E
Знаковое число в экспоненциальном формате
g, G
Знаковое число в смешанном формате
c
Один символ
s
Печатается строка символов до нулевого
p
Вывод указателя в шестнадцатеричном формате
9

10.

Флаги
Флаг
10
Назначение
Выравнивание результата по левой границе. Если не

задан флаг, то выравнивание по правой границе поля
+
Обязательно выводится знак '+' для положительных чисел
Если не указан флаг +, то перед положительными числами
пробел
на месте знака числа будет выводиться пробел
#
Альтернативная форма представления некоторых типов
Спецификатор формата может иметь несколько флагов,
которые могут принимать значения, указанные в таблице
Спецификатор флаги можно не указывать.

11.

Ширина
Ширина
n
0n
*
11
Назначение
Печатается как минимум n знаков. Если число имеет
меньше символов, то дополняется пробелами
Печатается как минимум n знаков. Если число
имеет меньше символов, то дополняется нулями
Ширина указывается переменной типа int в списке
аргументов
Спецификатор ширина можно не указывать.

12.

Точность
12
Точность
Назначение
нет
Используется точность по умолчанию (6 для f, e, E;
1 для d, i, u, o, x, X; все значащие цифры для g, G)
.0
.n
.*
Децимальный знак не печатается
Печатается n децимальных знаков для f, e, E, g, G.
Для s задает максимальное число символов. Для
d, i, u, o, x, X дополняет нулями слева, если число
имеет меньше знаков.
Точность указывается переменной типа int в
списке аргументов
Действия спецификатора точность зависит от типа
выводимого числа.
Спецификатор точность можно не указывать.

13.

Модификаторы
Префикс
Типы
Назначение
h
diouxX
short int
l
diouxX
long int
L
diouxX
__int64
l
eEfgG
double
L
eEfgG
long double
Спецификатор модификаторы определяет размер
выводимых данных (short, long, double, long double).
13

14.

Специальные символы
14
Назначение
\a
Издается звуковой сигнал
\b
\v
Удаляет последний выведенный символ
Перевод строки. Новый символ будет напечатан на
позиции, следующей за последним символом
Перевод строки. Следующий символ будет
напечатан с начала новой строки.
Возврат каретки. Следующий символ будет
напечатан с начала текущей строки.
Вертикальная табуляция
\t
Табуляция по горизонтали
\\
Вывод обратного слеша
\“, \’
Вывод кавычек
\f
\n
\r
\%, %% Вывод процента

15.

Преобразование целых чисел
Пример кода
int x = 123;
printf("%d", x);
%d
1
% d
%-6d
1
2
3
1
2
2
3
3
%6x
%6o
7
b
1
7
3
%08d
0
0
0
0
0
1
2
%+.6d
+
0
0
0
1
2
3
3
15

16.

Преобразование чисел
с плавающей точкой
16
Пример кода
double x = 123.45;
printf("%lf", x);
%lf
1
2
3
.
4
5
0
%.3lf
1
2
3
.
4
5
0
1
2
3
.
%9.3lf
0
0
4
5
0
0
%lg
1
2
3
.
4
5
%.4lE
1
.
2
3
4
5
E
+
%-+9.3lf
+
1
2
3
.
4
5
0
0
2

17.

17
Преобразование строк
Пример кода
char* p = "Строка";
printf("%s", p);
%s
С
т
р
%9s
о
к
а
С
т
р
а
%-8s
С
т
р
о
к
%.5s
С
т
р
о
к
С
т
р
%5.3s
о
к
а

18.

Примеры форматного вывода
18
int i = 123;
double d = 42;
float f = 1543;
printf("%d\t%4.2lf\t%6.1f\n", i, d, f);
1 2 3
4 2 . 0 0
1 5 4 3 . 0 \n
int i = 7;
float d = 42;
printf("d = %*.*f\n", i, 2, d);
d
=
4 2 . 0 0 \n

19.

Форматированный ввод
19
Функция scanf считывает данные из стандартного потока
ввода, преобразуя их в соответствии с правилами,
указанными в строке format, и присваивает переменным,
адреса которых передаются в списке аргументов. В случае
успеха возвращает количество обработанных переменных.
int scanf (const char* format [, адрес, ...]);
Текстовые данные
клавиатура
Формат
Двоичные данные
Преобразование
char
short
long
double
Правила задаются набором трех типов директив:
1. Спецификаторы формата;
2. Специальные символы (пробел, табуляция, новая строка);
3. Прочие символы (отличные от специальных).

20.

Спецификаторы формата scanf
20
Каждый спецификатор начинается со знака процента %.
После % идут компоненты формата в следующем порядке:
%[*][ширина][модификаторы]тип
Компонент
*
ширина
Назначение
Опция
Текущее поле ввода будет
сканироваться, но не присваивается необязат.
соответствующему аргументу
Максимальное количество
символов, которые считываются из необязат.
текущего поля ввода
модификатор Уточняет размер типа переменной
тип
Тип переменной
необязат.
обязател.

21.

Типы преобразования
21
Набор типов, обрабатываемый функцией scanf, немного
больше, чем у функции printf. Дополнительные значения
приведены в таблице.
Тип
n
Назначение
Читает целое в любом формате (десятичное,
восьмеричное или шестнадцатеричное)
Принимает целое значение, равное количеству
прочитанных до сих пор символов
[]
Задает набор считываемых символов
%
Читает знак процента
i
Спецификатор модификаторы определяет размер вводимых
данных также, как и для функции printf.

22.

Специальные и прочие символы
22
Специальные символы в строке форматирования заставляют
функцию scanf пропускать один или больше специальных
символов во входном потоке. Один специальный символ
указывает функции scanf считывать, не запоминая любое
количество (включая 0) идущих подряд специальных
символов, пока не встретится неспециальный символом.
Если в строке форматирования встретился символ,
отличный от специального, то функция scanf прочитает и
отбросит его. Например, если в строке форматирования
встретится %d,%d, то функция scanf сначала прочитает
целое значение, затем прочитает и отбросит запятую и,
наконец, прочитает еще одно целое. Если заданный символ
не найден, функция scanf завершает работу.

23.

Набор считываемых символов [ ]
23
С помощью типа [ ] задаются символы, которые будут
считываться функцией scanf и присваиваться элементам
массива символов. Для определения такого набора надо в
квадратные скобки поместить необходимые символы.
Например, %[ABC] указывает функции scanf считывать
только символы А, В и С пока не встретится символ, не
входящий в данный набор.
С помощью дефиса можно задать диапазон считываемых
символов. Например, %[A-Z] дает указание функции scanf
принимать буквы от А до Z.
Если первый символ в наборе является знаком ^, то тогда
функция scanf будет считывать все символы пока не
встретит символ входящий в заданный набор. Таким
способом лучше всего считывать строку в которой слова
разделены пробелами.

24.

Примеры форматного ввода
1 2 ,
7 ,
1 4 . 5 \n
int i, j;
double d;
scanf("%d,%d,%lf", &i, &j, &d);
1 0 )
7 . 5 5
я б л о к о \n
char str[51];
float f;
scanf("%*d) %f %50s", &f, str);
р о г а
и
к о п ы т а ! \n
char s[15];
scanf("%14[^\n]\n", s);
24
English     Русский Правила