Форматированный ввод и вывод
Две функции - scanfO и рriпtf() (спецификации в файле прототипов stdio.h) выполняют, соответственно, консольный ввод и вывод. Этим функциям передаeтcя переменное число аргументов, но первым аргументом всегда являercя текcтoвая (так называемая форматная) строка. Она задает способ преобразования данных. Функция priпtf() выдает на экран всю форматную строку, в которой знак %ххх заменяeтcя символами выводимой информации. Символы после % до первогo разделителя рассматриваются как спецификация преобразования значения выводимой переменной. Имя переменной - этo второй, третий и т.д. аргументы списка аргументов.
Функция scanf( ) принимает с консоли все символы до нажатия клавиши ENTER и помещает их в буфер. Затем по форматной строке определяется способ преобразования введенных символов в соответствии с заданными спецификациями. Полученное в результате преобразования число помещается по адресу переменной, который является вторым, 3-им и т.д. аргументом в списке аргументов функции. Спецификация преобразования задается в виде последовательности
% [флаги ] [ширина] [. точность] [F | N | h |1 ]<тип>
Каждое из выделенных выше квадратными скобками полей (т.о. указывается, что поля необязательны, но их расположение в порядке перечисления должно строго соблюдаться).
В табл. ниже перечисляются некоторые из знаков, задающих спецификации преобразования.
Функции scanf() и printf() возвращают в качестве прямого результата своей работы количество правильно переданных или принятых элементов. Этот факт можно использовать в программе для контроля выполнения ввода и вывода – сравнивая возвращаемое функциями значение с числом элементов в списке ввода или вывода.
Флаги | Эффект (для вывода) |
- | Выравнивание влево (по умолчанию - вправо) |
+ | Выводится знак (по умолчанию – только если минус) |
Пробел | Выводится пробел, если число положительное |
# | Выводится индикатор типа: 0 перед восьмеричным, 0х или 0Х перед 16-ричным, точка для чисел с плавающей точкой |
Ширина | Эффект (только для вывода) |
n | Указывает минимальную ширину поля для вывода, если не хватает, то используется больше |
0n | Тот-же эффект, но лишние позиции слева заполняются нулями |
* | Следующий аргумент в списке аргументов функции определяет ширину поля |
Точность | Эффект (только для вывода) |
Ничего | Точность по умолчанию |
.0 | Для типов данных d, I, o, u, x – точность по умолчанию, для e, E, f – без точки |
.n | Для типов данных e, E, f – не более n знаков после точки |
* | Следующий аргумент в списке аргументов функции определяет точность |
Модификатор | Эффект |
F или N | Значение рассматривается как far- или near-указатель |
h или l | Для соответствующих типов данных аргумент рассматривается как short (h), long(l) или double(l). |
Тип | Эффект |
c | Один байт или char |
d, i | Десятичное со знаком |
o, u | Восьмеричное и десятичное, соответственно, unsigned |
x, X | Шестнадцатиричное (при выводе, соответственно, используются малые или большие символы от a до f) |
f | Значение с точкой и знаком |
e, E | Значение выводится с точкой за первой значащей цифрой, указывается порядок |
g, G | Применяется формат f, e или E в зависимости от согласованности значения и указанной точности для отображения |
s | Применяется для литерных массивов. При вводе принимает все символы до ‘\n’ или в соответствии с указанной в спецификации точностью. При выводе отображает данные до ‘\0’ или в соответствии с указанной в спецификации точностью. |
Самостоятельно - выяснить недостающие спецификаторы типа!
Пример
#include <stdio.h>
void main( void)
{
сhar ch; int i, j; l/oat х, х2; сhar name[81];
printf("\nВвeдитe Ваше имя:");
scanf("%s", name);
рrintf("Здравствуйте, %s. Вас приветствует”
"звонком комnьютер\а\n", name);
рrintf("Введите любое целоe число:" );
fflush(stdin);
scanf("%d", &i);
j = i + 4;
printf("%d + 4 = %d, верно?\n", i, j);
printf("Bвeдитe число с плавающей точкой: ");
scanf("%f, &х); х2 = х * х;
рrintf("%f в квадрате = %f, верно?\n", х, х2);
printf("Bвeдиme любoй символ: " );
fflush(stdin);
scaпf{"%c", &ch);
printf("ASCII-код cuмвoлa %с = %d (%#х)\n",
ch, ch, ch);
}
Далее.приводятся. результаты работы программы:
Введите Ваше uмя: Александр Касаткин
Здравствуйте, Александр. Вас приветствует звонком компьютер
Введите любое целое число: 36
36 + 4 = 40, верно?
Введите число с плавающей точкой: 5.е1
50.000000 в квадрате = 2500.000000, верно?
Введите любой сuмвол: 1
ASCII-код сuмвола 1 = 49 (0хЗ1)
Программа последовательно выдает приглaшения. После набора запрашиваемой информации следует нажать клавишу ENTER. После ее нажатия функция scanf() прекращает прием символов во внутренний буфер и переходит к обработке ввода в соответствии с форматной строкой. На приглашение ввести имя в буфер функции было помещено два слова - имя и фамилия. При выводе же строки namе функцией printf() на экране появляется только первое слово - имя. Дело в том, что по спецификации %s функция scanf() передает в программу все символы до первогo разделителя, такого как пробел, табуляция. Оставшиеся в буфере символы будут поступать в прогpамму при следующих обращениях к функции scanf(), что нe входит в наши планы. Вот почему перед очередным обращением к функции scanf() выполняется очистка буфера stdin функцией fflush(). После вывода на экран второй строки звенит звонок, так как на консоль выдается символ '\а'.
Следует обратить внимание на то, что для скалярных переменных при вводе данных необходимо указывать их адрес (применять операцию &). Указание имен массивов приводит к автоматической генерации их базовых адресов размещения в ОЗУ. При выводе данных в качестве параметров функции printf() можно указывать выражения.
Пример
int i, j; float x;
char s[81];
scanf(“%d%d%f%s”, &i, &j, &x, s);
printf(“y = %f”, x + 12.05);
Дата добавления: 2016-05-26; просмотров: 1763;