Задачи ввода/вывода в языке Си решают функции printf() и scanf().
Операторы вывода используются для вывода значений переменных и текста.
Тексты в Си записываются в кавычках. В языке Си отсутствует специальный тип для работы со строками. Вместо этого строки представляются как массив типа char. Элементы строки, хранясь в массиве, записываются в смежные ячейки памяти. В конце строки ставится отметка \0. Наличие этой отметки говорит о том, что строка должна иметь размер на единицу больший, чем количество символов. Объявляется строка указанием типа char и записью размера в [].
Пример:
char name[40];
Для работы со строками к программе необходимо подключить файл string.h.
Каждая из функций ввода/вывода использует управляющую строку и список аргументов. Управляющая строка записывается первой и заключается в кавычки. Управляющие строки и аргументы не перемешиваются. Управляющие строки прежде всего содержат указание на вывод значения того или иного типа. Их называют спецификаторами преобразования.
Спецификаторы
| Действия
|
%a, %A
| возвращают число с плавающей точкой и 16-е цифры
|
%c
| возвращает одиночный символ
|
%d, %i
| возвращают целое число в десятичной форме
|
%e, %E
| возвращают число с плавающей точкой в экспоненциальной форме
|
%f
| возвращает число с плавающей точкой в десятичной форме
|
%g
| использует спецификатор %f или %e в зависимости от значения (выбирается автоматически)
|
%o
| возвращает восьмеричное целое число без знака
|
%p
| вывод указателя в шестнадцатеричном формате
|
%s
| возвращает строку символов
|
%u
| возвращает десятичное целое число без знака
|
%x, %X
| возвращают шестнадцатеричное целое число без знака
|
%%
| вывод на печать символа %
|
Основную спецификацию можно модифицировать вставляя между % и символом преобразования модификаторы.
Модификаторы
| Действия
|
цифра/цифры
| минимальная ширина поля вывода (количество экранных символов)
|
.цифра
| точность
|
h
| используется при целочисленных преобразованиях для кодирования значений short int и unsigned short int
|
hh
| используется при целочисленных преобразованиях для кодирования значений signed char и unsigned char
|
j
| используется при целочисленных преобразованиях для получения типов int_max_t и uint_max_t
|
l
| используется при целочисленных преобразованиях для получения типа long int и unsigned long int
|
ll
| используется при целочисленных преобразованиях для получения типа long long int и unsigned long long int
|
t
| используется с целью кодирования значений типа ptroliff_t, который является разностью двух указателей
|
z
| используется с целью кодирования значений size_t
|
L
| используется при преобразовании чисел с плавающей точкой типа long double
|
флаг
| +
| значения со знаком печатаются со знаком "+" или "-"
|
флаг
| -
| элемент выравнивается по левому краю
|
флаг
| пробел
| значение со знаком "+" печатается с пробелом, но без знака
|
флаг
| #
| для спецификаторов %o, %x, %X выводит не значащие нули. Для форм с плавающей точкой гарантировано печатается точка, даже если десятичных знаков нет
|
флаг
|
| для числовых форм вместо пробелов на свободные экранные места выводятся нули
|
Ввод данных осуществляется с помощью функции scanf(). В языке Си существует несколько функций ввода. scanf() употребляется чаще других, т.к. ей присущ различный формат ввода. Также как и функция printf(), ввод использует управляющую строку, сопровождаемую списком аргументов. Управляющая строка указывает в какие форматы должен быть преобразован вводимый текст. В качестве параметров функция scanf() использует не сами переменные, а указатели на них. Для использования scanf()необходимо выполнять два правила:
1) если функция используется для считывания значений в переменную основного типа, то перед именем переменной ставится знак &.
2) если значение считывается в символьный массив, то символ & не ставится.
Преобразование одного вводимого данного осуществляется указанием спецификатора преобразования. Если данных вводится несколько, то они разделяются знаком пробела.
Спецификаторы
| Действия
|
%c
| интерпретирует результат ввода в качестве символа
|
%d
| интерпретирует результат ввода как десятичное целое число со знаком
|
%e, %f, %g, %a
| интерпретирует результат ввода как число с плавающей точкой
|
%E, %F, %G, %A
| интерпретирует результат ввода как число с плавающей точкой. Все вводимые символы преобразуются в заглавные
|
%o
| интерпретирует результат ввода как восьмеричное целое число со знаком
|
%з
| интерпретирует результат ввода как указатель
|
%s
| интерпретирует результат ввода как строку. Ввод начинается с первого символа, не являющегося служебным и включает все символы до следующего служебного
|
%u
| интерпретирует результат ввода как целое число без знака
|
%x, %X
| интерпретирует результат ввода как шестнадцатеричное целое число со знаком
|
Между знаком % и символом преобразования могут использоваться модификаторы. Если их более одного, то они должны записываться в порядке, указанном в таблице ниже:
Модификаторы
| Действия
|
*
| подавить присваивание
|
цифра/цифры
| максимальная ширина поля ввода. Ввод прекращается когда указанная ширина достигнута или при обнаружении служебного символа
|
hh
| определяет считывание целого числа в виде signed char или unsigned char
|
ll
| определяет считывание целого числа в виде long long или unsigned long long
|
L, l, h
| определяет считывание числа в виде short int, unsigned short int, unsigned long, long, double или long double
|