Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Модификаторы типа




Функции форматного ввода/вывода (scanf/printf) файл stdio.h

Функция вывода printf(),выполняет форматируемый вывод в стандартный поток stdout. (т.е. значения переменных, которые хранятся в памяти в двоичном виде, при выводе в поток (на экран) переводятся в символьный вид, причем вид преобразования задается спецификатором формата. Спецификаторы формата задаются как составная часть обязательного первого аргумента — форматной строки. После форматной строки задается список выражений, значения которых должны выдаваться на экран. В качестве выражений допускается задавать и переменные. Функция возвращает количество выведенных символов. Спецификатор формата начинаются символом % (процент), вслед за которым прописывается код формата. Количество аргументов-переменных должно в точности соответствовать количеству спецификаторов формата. При отсутствии списка переменных функция просто выводит в поток (на экран) форматную строку.

спецификация формата имеет следующий вид:

%[флаг][ширина][.точность][h|l|L]тип\

здесь квадратные скобки означают, что соответствующий элемент спецификации может отсутствовать. В простейшем виде спецификатор формата записывается как

%тип

Тип задается одной буквой, и определяет, в каком виде предстанет значение переменной в потоке (на экране). Так как знак процента % используется как управляющий, то для вывода его в поток надо прописать его в форматной строке дважды %%.

Таблица. Некоторые типы спецификаторов формата

Тип Вид в потоке
c Символ
s Строка символов
d, i Целое десятичное со знаком
o Целое восьмеричное
u Целое десятичное без знака
Х,х Целое шестнадцатеричное
f Дробное число в фиксированном формате
e, E Дробное число в научном формате
g, G Дробное число в научном или фиксированном формате
p Указатель (в шестнадцатеричном виде)

Ширина показывает, сколько символов будет выведено в поток. В это число входят все символы: и знак, и десятичная точка для дробных чисел. Если ширина окажется фактически меньше, чем требуется для вывода, то все равно значение выводится полностью. Точность задает количество цифр дробной части и применяется обычно только для дробных чисел.

Перед типом может стоять модификатор типа. Обычно модификаторы применяются к числовым переменным: в этом случае они указывают короткую (h) или длинную (L,l) форму типа. Например, тип %f применяется для вывода значений типа float, %lf — для вывода double, а %Lf — для вывода значений long double.

Модификатор Спецификатор формата Тип переменной
h i d u o x X short int
l i d u o x X long int
l e E f g G double
L e E f g G long double

Вместо ширины и точности в спецификаторе формата можно указывать символ * (звездочка). Это позволяет задавать и ширину, и точность как значения целых переменных — это позволяет вычислять ширину поля вывода во время выполнения программы. Рассмотрим простейший пример:

//Переменные ширина и точность float number = -12.3; int w = 10, // ширина p = 4; // точность printf("%0*.*f\n", w, p, number); w = 15, p = 5; // новая ширина и точность printf("%0*.*f\n", w, p, number);

На экране выводятся две строки

-0012.3000

-00000012.30000

Переменные, в которых указаны ширина и точность, должны задаваться первыми в списке аргументов после форматной строки, иначе программа просто зацикливается.

В связи с возможностью задавать переменную ширину поля часто бывает необходимо знать количество символов, выведенных в поток после последнего освобождения буфера. И эту величину можно получить с помощью спецификатора %n. В списке аргументов после форматной строки задается адрес целой переменной, куда и заносится количество выведенных в поток символов. Например.

w = 15, p = 5; // новая ширина и точность int kk = 0; printf("%0*.*f%n\n", w, p, number, &kk); // вычисление количества printf("%d\n", kk); // выводит 15

В переменную kk, адрес которой задан в списке аргументов, помещается количество символов, выведенных в поток с момента последнего освобождения буфера, в данном случае 15.

А теперь про ввод

Функция scanf() выполняет форматируемый ввод из стандартного потока stdin в переменные программы. Так как stdin "привязан" к клавиатуре, то при вводе, очевидно, выполняется преобразование из символьного вида во внутренний двоичный формат. Первым параметром тоже является форматная строка, за которой следует список адресов переменных, куда требуется поместить задаваемые значения.

Символы в форматной строке делятся на три вида: спецификаторы формата, разделители и прочие. К разделителям относятся пробел, табуляция ('\t') и символ конца строки ('\n'). Спецификаторы формата — такие же, как и для функции printf().

В общем виде спецификатор формата имеет следующую форму:

%[ширина][h/l/L]тип, квадратные скобки означают, что этот элемент спецификатора может отсутствовать. По сравнению со спецификатором формата для вывода только символ *(звездочка) имеет другой смысл: если она указана, то запись значения в соответствующую переменную не происходит. Например, можно определить ввод двух значений в две числовых переменных, разделяя их при вводе любым символом

double a,b; scanf("%lf%*c%lf",&a,&b);

В этом случае мы можем задавать ввод и так

1б2

и так

1,2

и так

1-2

Во всех случаях в переменную a попадет значение 1, а в переменную b — значение 2.

ПРИМЕЧАНИЕ

Ввод строк выполняется обычно другими, более подходящими функциями, например, fgets(), которую мы далее рассмотрим. При этом, естественно, речь идет о символьных массивах, а не о переменных типа string.

char ss [80] = {0}; // объявление символьного массива scanf("%s",ss); // имя ss пишется без амперсанта!

Если мы попробуем ввести последовательность символов "1234 567", то в массив ss попадет только "1234". Кроме того, обратите внимание, что имя массива нужно прописывать без амперсанта — это единственное исключение из общего правила!

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

char c1,c2,c3; double d1, d2, d3; scanf("%c,%c,%c",&c1,&c2, &c3); // ввод трех символов scanf("%lf,%lf,%lf",&d1,&d2, &d3); // ввод трех чисел

При вводе надо так и набирать на клавиатуре

а,б,в<Enter> // ввод трех символов

1,2,3<Enter> // ввод трех чисел




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


Дата добавления: 2015-05-10; Просмотров: 438; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.