Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
14.03.2016
Размер:
94.69 Кб
Скачать

Функции форматированного ввода-вывода printf() и scanf()

Функции printf() и scanf() осуществляют форматированный ввод и вывод данных на консоль. Формат ввода и вывода данных определяется управляющей строкой.

Прототип функции printf(), описанный в заголовочном файле stdio.h, имеет вид:

int printf (char *управляющая_строка, [аргументы …]);

Управляющая строка содержит спецификаторы формата, определяющие формат выводимых данных, и собственно выводимые символы. Спецификатор формата начинается с символа % и состоит из обязательных и необязательных полей:

%[флаги] [ширина_поля] [.точность] [{h | l | ll | I | I32 | I64}]тип

где поле тип может принимать значения:

с – символ,

d, i – целое десятичное число,

e – десятичное число в экспоненциальной форме: x.xx e+xx,

E – десятичное число в экспоненциальной форме: x.xx E+xx,

f – десятичное число с плавающей точкой,

g – f или e, что короче,

G – f или E, что короче,

o – восьмеричное число,

s – строка символов,

u – беззнаковое целое десятичное число,

x – шестнадцатиричное число, например: 1c2d,

X – шестнадцатиричное число, например: 1C2D,

% – символ %,

n, p – указатель;

поле флаги может принимать значения:

- – выравнивание результата по левой границе в пределах ширина поля (по умолчанию выравнивание производится по правой границе),

+ - выводить знак (+ или -) если выводимое значение его имеет (по умолчанию знак выводится только для отрицательных значений),

0 – дополнять выводимое значение впереди стоящими нулями до ширины поля вывода;

ширина_поля – положительное целочисленное значение, задающее минимальное число выводимых символов. Если число выводимых символов меньше ширины поля, слева или справа они дополняются пробелами (или нулями при использовании флага 0);

точность – минимальное количество знаков после запятой для чисел с плавающей точкой, максимальная ширина поля вывода для строк и минимальная ширина поля вывода для целых чисел.

Также применяются модификаторы l и h, например:

%ld – вывод long int,

%hu – вывод short unsigned,

%Lf – вывод long double.

В прототипе функции в качестве списка аргументов обозначены переменные или константы, подлежащие выдаче в соответствующем формате, следующими по порядку. Например, использование printf("%05d %i",15,1); даст результат: 00015 1.

Scanf() – функция ввода с консоли, предназначенная для ввода данных любого встроенного типа и автоматически преобразующая введенное значение в заданный формат.

Прототип функции scanf(), описанный в заголовочном файле stdio.h, имеет вид:

int scanf (char *управляющая_строка, [аргументы …]);

Управляющая строка содержит спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %:

%[*] [ширина_поля] [{h | l | ll | I64 | L}]тип

где поле тип может принимать значения:

с – символ,

d, i - целое десятичное число,

e – число типа float,

o – восьмеричное число,

s – строка,

x – шестнадцатиричное число,

p, n – указатель.

Также применяются модификаторы l, L, h, аналогично их использованию с функцией printf().

Ширина_поля – наибольшая ширина поля, которая подлежит считыванию. Например, использование scanf("%5s", str); при вводе 123456789 приведет к тому, что массив str будет содержать только строку «12345», остальные символы будут проигнорированы. Разделители (пробел, символы табуляции и новой строки) при вводе символа воспринимаются, как и все другие символы.

Знак * после % позволяет прочитать введенные данные указанного типа, но не присваивать это значение. Например, scanf("%d%*c%d", &i, &j); при вводе 1+2 присвоит переменным i и j значения 1 и 2 соответственно, а символ + будет прочитан и проигнорирован. Если в управляющей строке встречаются какие-либо другие символы, то они используются для определения и пропуска соответствующих символов при вводе. Например, ввод символов 3plus2 при использовании оператора scanf("%dplus%d", &i, &j); присвоит переменным i и j значения 3 и 2 соответственно, а символы plus пропустит, так как они встретились в управляющей строке.

При использовании функции scanf() невозможно вывести приглашение для ввода. Его необходимо вывести до вызова функции scanf().

Также при использовании функции scanf() имеется возможность задания множества поиска (scanset), определяющее набор символов, с которыми будут сравниваться читаемые функцией scanf() символы. Функция scanf() читает символы до тех пор, пока они встречаются в множестве поиска. Как только символ, который введен, не встретился в множестве поиска, функция переходит к следующему спецификатору формата. Множество поиска определяется списком символов, заключённых в квадратные скобки. Например:

#include <stdio.h> void main(void)

{

char str1[10], str2[10]; scanf("%[0123456789]%s", str1, str2); printf("\n%s\n%s",str1,str2);

}

при вводе: 12345abcdefg456 выдаст: 12345

abcdefg456

При задании множества поиска можно также использовать символ "дефис" для задания промежутков, а также максимальную ширину поля ввода, например:

scanf("%5[a-h1-8]", str1);

В качестве аргументов функции scanf() используются адреса переменных.