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


Две функции - 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.015 сек.