Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
1.67 Mб
Скачать
    1. Форматированный консольный ввод-вывод

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

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

Функция printf() имеет следующий прототип:

int printf(const char *форматная_строка, …);

Первый аргумент форматная_строка определяет способ вывода последующих аргументов. Он часто называется форматной строкой и содержит два типа элементов: символы, выводимые на экран и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. Спецификаторы формата начинаются со знака “%”, за которым следует код формата. Спецификаторы формата приведены в таблице 1. Должно быть полное соответствие между числом аргументов и числом спецификаторов формата, а также спецификаторы формата и аргументы должны соответствовать друг другу слева направо. Например, вызов:

printf(“Hi %c %d %s”, ‘c’,10, “there!”0;

отобразит на экране «Hi c 10 there!». Функция printf() возвращает число напечатанных символов. В случае ошибки она возвращает EOF.

Таблица 1 – Спецификаторы формата функции printf()

Код

Формат

%c

%d

%i

%е

%Е

%f

%g

%G

%o

%s

%u

%x

%X

%p

%n

%%

Символ

Знаковое десятичное целое число

Знаковое десятичное целое число

Научная нотация (е – строчная)

Научная нотация (Е – прописная)

Десятичное число с плавающей точкой

Использует или %e, или %f, соответствующее более короткому представлению

Использует или %E, или %F, соответствующее более короткому представлению

Беззнаковое восьмиричное число

Строка символов

Беззнаковое десятичное число

Беззнаковое шестнадцатиричное число (строчные буквы)

Беззнаковое шестнадцатиричное число (прописные буквы)

Вывод указателя

Ассоциированный аргумент – это указатель на целое, в которое записывается число уже введенных символов

Выводит знак %

Печать символов

Для печати отдельных символов используйте спецификатор %c. Это приводит к выводу соответствующего аргумента в немодифицированном виде на экран.

Для печати строки используйте спецификатор %s.

Вывод чисел

Можно использовать или спецификатор %d, или спецификатор %i для отбрахения знакового десятичного целого числа. Эти форматы эквивалентны и присутствуют оба по историческим причинам.

Для вывода беззнакового значения надо использовать спецификатор %u.

Спецификатор формата %f позволяет отображать числа с плавающей точкой.

Спецификаторы %e и %E сообщают printf() о небходимости вывода вещественного числа в научной нотации. Числа, представленные в научной нотации, имеют вид:

x.dddddE+/-yy.

Если необходимо вывести символ «Е», используйте %Е, иначе используйте %е.

Можно указать функции printf() использовать %f или %е, используя спецификаторы формата %g или %G. В результате этого printf() выбирает спецификатор формата, приводящий к более короткой форме выдачи информации. Если необходимо, чтобы в научной нотации присутствовало «Е», используйте %G, иначе - %g.

Можно отображать беззнаковые целые в восьмиричном или шестнадцатиричном форматах, используя %о и %х соответственно. Поскольку шестнадцатиричные числа используют буквы от А до F для представления чисел от 10 до 15, следует использовать спецификатор формата %Х для вывода прописных букв, а %х - для строчных.

Вывод адресов

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

#include <stdio.h>

int sample;

int main(void);

{

printf(“%p”, &sample);

{

Спецификатор %n

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

#include <stdio.h>;

int main(void)

{

int count;

printf(“this%n is a test\n”, &count);

printf(“%d”, count)

}

Программа выводит в первой строке this is a test, а во второй строке число 4. Спецификатор %n используется, как правило, для выполнения динамического форматирования.

Спецификатор минимума ширины поля

Целое число, помещаемое между знаком % и кодом формата, рассматривается как спецификатор минимума ширины поля. Он добавляет к выводу пробелы, для обеспечения некоторой минимальной длины. Если строка чисел длиннее, чем этот минимум, то она будет выводится без отсечений. По умолчанию для достижения необходимой длины строка дополняется пробелами. Если необходимо выводить не пробелы, а нули, следует поставить ноль перед спецификатором ширины поля. Например, спецификатор %05d будет выводить числа, длиной меньше пяти символов с впереди стоящими нулями, чтобы полная длина была пять. Следующая программа демонстрирует использование спецификатора минимума длины поля:

#include <stdio.h>

int main(void)

{

double item;

item = 10.12304;

printf(“%f\n”,item);

printf(“%10f\n”,item);

printf(“%012f\n”,item);

}

В результате работы данной программы получаем:

10.123040

10.123040

00010.123040

Спецификатор точности

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

При применении спецификатора точности к вещественным данным, используя спецификаторы %f, %e или %Е, он определяет число выводимых цифр в дробной части. Например, %10.4f выводит числа, по крайней мере, с длиной строки в 10 символов, причем под дробную часть отводится 4 символа. Если не указать точность, то по умолчанию используется шесть символов.

Когда спецификатор точности применяется к %g или %G, он определяет число значимых цифр.

Применение спецификатора точности к строкам ограничивает длину строки. Например, %5.7s длиннее, чем максимальная указанная ширина, оставшиеся символы отбрасываются.

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

Следующая программа иллюстрирует применение спецификатора точности:

#include <stdio.h>

int main(void)

{

printf(“%.4f\n”, 123.1234567);

printf(“%3.8d\n”, 1000);

printf(“%10.15s\”, “This is a simple test”);

}

В результате работ программы получаем:

123.1235

00001000

This is a simpl

Выровненный вывод

По умолчанию все выводимое выравнивается по правому краю. То есть, если поле имеет ширину, большую чем выводимые данные, то данные размещаются с правого края поля. Можно выводить информацию с левого края, поместив знак минус сразу после %. Например, %-10.2f приведет к выравниванию по левому краю вещественного числа с двумя знаками после запятой в 10-символьном поле.

Работа с другими типами данных

Имеется два модификатора формата, позволяющие функции printf() выводить короткие и длинные целые. Эти модификаторы могут применяться к спецификаторам типа d, i, o, u, x. Модификатор l сообщает функции printf() о том, что далее будет следовать длинный тип данных. Например, %ld означает, что будет выводится значение типа long int. Модификатор h говорит функции printf() о необходимости вывода коротких целых. Например, %hu выводит данные типа short unsigned int.

Модификатор L может стоять перед спецификатором плавающего типа e, f и g , тем самым указывая, далее следуют переменные типа long double.

Модификаторы * и #

Функция printf() поддерживает два дополнительных модификатора для некоторых спецификаторов формата: * и # .

Помещение # перед g, G, f, e или Е обеспечивает наличие десятичной точки в случае отсутствия дробной части. Если перед спецификатором формата х или Х поставить #, то шестнадцатиричное число будет печататься с префиксом 0х. Если перед спецификатором о поместить #, то выведенное число будет иметь в начале 0. Нельзя применять # к остальным спецификаторам формата.

Помимо констант, спецификаторы минимальной ширины поля и точности могут предоставляться аргументами функции printf(). Для реализации этого следует использовать *. Когда форматная строка сканируется, функция будет сопоставлять со звездочкой аргументы в порядке появления. Например, для следющего вызова функции

printf(“%*.*f”,10,4, 123.3);

минимальная ширина поля равна 10, точность – 4, а вводимое значение – 123.3.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]