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

C_Kurs_Lekt / C_I_семестр / 09_Файлы_потоки_printf_scanf

.pdf
Скачиваний:
12
Добавлен:
13.02.2016
Размер:
151.11 Кб
Скачать

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

1

ВВОД И ВЫВОД. ПОТОКИ.

В стандарте языка Си отсутствуют средства ввода-вывода. Все операции ввода-вывода реализуются с помощью функций, находящихся в библиотеке языка Си, поставляемой в составе конкретной системы программирования Си.

Библиотека языка Си поддерживает три уровня ввода-вывода: потоковый ввод-вывод, ввод-вывод нижнего уровня и вводвывод для консоли и портов.

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

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

Обрабатываемые компьютерами элементы образуют иерархию данных, в которой элементы данных становятся больше по размеру и сложнее по структуре по мере продвижения от битов к символам (байтам), полям и т.д.

Запись (соответствует в С понятию struct) - это группа логически связанных полей.

Ôàéë - группа связанных записей. С рассматривает любой файл как последовательный поток байтов.

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

Весь ввод и вывод выполняется посредством потоков — последовательностей символов с построчной организацией. Каждая строка содержит нулевое или большее число символов и заканчивается символом новой строки. Стандарт языка С объявляет, что реализация ANSI С должна поддерживать строки по меньшей мере из 254 символов, включая ограничивающий символ новой строки.

При запуске программы к ней автоматически присоединяются три потока. Стандартный поток ввода обычно присоединяется к клавиатуре (на него ссылаются, используя предопределенный указатель на поток stdin), а стандартный поток вывода (stdout)— к устройству вывода информации на экран монитора (экрану). Операционные системы нередко позволяют переадресовать эти потоки на другие устройства. Третий поток — стандартный поток ошибок (stderr) — также присоединяется к экрану. В него выводятся сообщения об ошибках.

Для ввода-вывода данных с помощью стандартных потоков в библиотеке языка Си определены следующие функции: getchar( )/putchar() - ввод-вывод отдельного символа;

gets( )/puts() - ввод-вывод строки;

scanf( )/printf() - ввод-вывод в режиме форматирования данных.

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

Для работы со стандартными потоками в режиме форматного ввода-вывода определены две функции: printf(), scanf().

Форматный вывод в стандартный выходной поток.

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

1.Округление значений с плавающей точкой до указанного числа десятичных знаков.

2.Выравнивание столбца чисел по положению десятичной точки в столбце.

3.Выравнивание выводимых данных по правому краю è по левому краю.

4.Вставка литеральных символов в заданное место выводимой строки.

5.Представление числа с плавающей точкой в экспоненциальном формате.

6.Представление целого без знака в восьмеричном и шестнадцатеричном формате.

7.Вывод данных всех типов с фиксированной шириной поля и точностью представления.

Прототип функции printf( ) имеет вид: int printf(const char *format,. . .);

При обращении к функции printf( ) возможны две формы задания первого параметра: int printf ( форматная_строêа, списоê_арãóментов);

int printf ( óêазателъ_на_форматнóю_строêó, списоê_арãóментов);

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

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

цификации преобразования данных. Текст и управляющие символы из форматной строки просто копируются в выходной поток.

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

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

èот системы программирования). Если аргументов больше, чем указано в форматной строке, "лишние" аргументы игнорируются. Список_аргументов (с предшествующей запятой) может отсутствовать.

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

% флаãи ширина_поля.точностъ модифиêатор специфиêатор

Символ % является признаком спецификации преобразования В спецификации преобразования обязательными являются только два элемента: признак % и спецификатор.

Спецификация преобразования не должна содержать внутри себя пробелов. Каждый элемент спецификации является одиночным символом или числом.

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

 

 

Спецификаторы форматной строки для функции форматного вывода

 

 

Формат вывода

 

Специфи-

Тип аргумента

 

катор

 

 

 

d

int, char, unsigned

Десятичное целое со знаком

 

i

int, char, unsigned

Десятичное целое со знаком

 

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

2

u

int, char, unsigned

o

int, char, unsigned

x

int, char, unsigned

X

int, char, unsigned

f

double, float

ådouble, float

Ådouble, float

g

double, float

 

 

G

double, float

ñint, char, unsigned

s char*

p

void *

n

%

Десятичное целое без знака Восьмеричное целое без знака

Шестнадцатеричное целое без знака; при выводе используются символы "0...9а...f" Шестнадцатеричное целое без знака; при выводе используются символы "0...9A...F" Вещественное значение со знаком в виде: знак_числаdddd.dddd, где dddd - одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины выводимого числа, а количество цифр после десятичной точки зависит от требуемой точности. Знак числа при отсутствии модификатора '+' изображается только для отрицательного числа

Вещественное значение в виде: знак_числаddddeзнакxxx, где m.dddd - изображение мантиссы числа; m - одна десятичная цифра; dddd - последовательность десятичных цифр; е - признак порядка; знак - знак порядка;

ххх - десятичные цифры для представления порядка числа; знак числа при отсутствии модификатора '+' изображается только для отрицательного числа

Идентичен спецификатору "е", за исключением того, что признаком порядка служит "Е" Вещественное значение со знаком печатается в формате спецификаторов "f" или "е" в зависимости от того, какой из них более компактен для данного значения и точности. Формат спецификатора "е" используется тогда, когда значение показателя меньше -4 или больше заданной точности. Конечные нули отбрасываются, а десятичная точка появляется, если за ней следует хотя бы одна цифра

Идентичен формату спецификатора "g", за исключением того, что признаком порядка служит "Е"

Одиночный символ Символьная строка. Символы печатаются либо до первого нулевого символа ('\0') или печа-

тается то количество символов, которое задано в поле точность спецификации преобразования Значение адреса. Печатает адрес, указанный аргументом (представление адреса зависит от реализации)

Сохраняет число символов, уже выведенных текущим оператором printf. Соответствующий аргумент является указателем на целое значение. Ничего не выводит.

Выводит символ процента.

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

шестнадцатеричной систем счисления. Флаги могут отсутствовать, а если они есть, то могут стоять в любом порядке.

Ôëàã

 

Описание

-

(çíàê

"минус")

Выравнивание вывода по левому краю в пределах заданной ширины поля.

+

(çíàê

"ïëþñ")

Вывод знака плюс перед положительными значениями и знак минус перед отрицательными.

пробел

 

Вывод пробела перед положительным значением при отсутствии в спецификации преобразо-

 

 

 

вания флага +.

#

 

 

Печать префикса 0 перед выводимым значением при использовании спецификатора преобра-

 

 

 

зования восьмеричных значений о.

 

 

 

Печать префикса 0х или 0Х перед выводимым значением при использовании спецификатора

 

 

 

преобразования шестнадцатеричных значений х или X.

 

 

 

При использовании со спецификаторами преобразования е, Е, f, g или G вынуждает печатать

 

 

 

десятичную точку для чисел с плавающей точкой, которые не содержат дробной части. (Обыч-

 

 

 

но десятичная точка выводится только при наличии хотя бы одной цифры справа от нее.) Для

 

 

 

спецификаторов g и G отменяет подавление правых нулей дробной части.

0

(íóëü)

 

Дополняет поле до заданной ширины нулями слева.

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

Если число символов в изображении выводимого значения больше, чем определено в ширине_поля, èëè ширина_поля не задана, печатаются все символы выводимого значения.

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

Точность задает:

минимальное число цифр, которые могут быть выведены при использовании спецификаторов d, i, о, и, х или X;

число цифр, которые будут выведены после десятичной точки при спецификаторах е, Е и f;

максимальное число значащих цифр при спецификаторах g и G;

максимальное число символов, которые будут выведены при спецификаторе s.

Ширину поля и точность представления можно задать, используя целочисленные выражения в списке аргументов после строки управления форматом. Чтобы это сделать, вставьте * (звездочку) вместо ширины поля или вместо точности (или вместо того и другого). Звездочки при печати будут заменены соответствующими значениями из списка аргументов. Значение аргумента для ширины поля может быть отрицательным, но для точности представления должно быть только положительным. Отрицательное значение ширины поля приводит к выравниванию вывода по левому краю поля.

Оператор printf("%*.*f", 7, 2, 98.736); использует значение 7 для ширины поля, 2 для точности представления и выводит значение 98.74 с выравниванием по правому краю поля.

Непосредственно за точностью может быть указан модификатор, который определяет тип ожидаемого аргумента и задается следующими символами:

Модификатор

Описание

h

указывает, что следующий после h спецификатор d, i, о, х или X применяется к аргументу

 

òèïà short èëè unsigned short

l

указывает, что следующий после l спецификатор d, i, о, х, X, f применяется к аргументу типа

 

long, unsigned long. Для спецификатора f применяется к аргументу типа double (long float)

L

указывает, что следующий после L спецификатор е, Е, f, g или G применяется к аргументу

 

òèïà long double

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

3

Печать литералов и Esc-последовательностей

Большинство литералов, которые выводятся оператором printf, могут быть просто включены в строку управления форматом. Однако существуют отдельные "проблемные" символы типа кавычек ("), которые ограничивают саму строку управления форматом. Различные управляющие символы типа символа новой строки и символа табуляции должны быть представлены соответствующей escape-последовательностью, èëè. escape-кодом. Esc-последовательность представляет собой обратную косую черту (\) с последующим escape-символом.

последовательность

Описание

\'

Вывод символа одинарной кавычки (').

\"

Вывод символа двойной кавычки ( " ).

\?

Вывод символа вопросительного знака ( ? ).

\\

Вывод символа обратной косой черты ( \ ).

\a

Вызывает звуковой сигнал (звонок) или визуальное предупреждение.

\b

Перемещает курсор на одну позицию назад в текущей строке.

\f

Перемещает курсор на начало следующей логической страницы.

\n

Перемещает курсор на начало следующей строки.

\r

Перемещает курсор на начало текущей строки.

\t

Перемещает курсор на следующую позицию горизонтальной табуляции.

\v

Перемещает курсор на следующую позицию вертикальной табуляции.

Примеры использования printf():

/* Использование специфиêаторов преобразования целых значений */ #include <stdio.h>

main () { printf("%d\n", 455);

printf("%i\n", 455); /* в printf i то же, что и d*/ printf("%d\n", +455);

printf("%d\n", -455); printf("%hd\n", 32000); printf("%ld\n", 2000000000); printf("%o\n", 455);

printf ("%u\n", 455);

printf("%u\n", -455); /* обратите внимание на преобразование */ printf("%x\n", 455);

printf("%X\n", 455); return 0; }

455

455

455 -455 32000

2000000000

707

455

65081

lc7

1C7

Число с плавающей точкой содержит десятичную точку, например, 33.5 èëè 657.983. Числа с плавающей точкой выводятся в одном из нескольких возможных форматов.

Спецификаторы преобразования е и Е выводят значение с плавающей точкой в экспоненциальной нотации. Экспоненциальная нотация — это компьютерный эквивалент научной нотации, используемой в физике. Например, в научной нотации значение 150.4582 представляется как 1.504582х102, а в экспоненциальной нотации компьютера 1.504582Е+02. Эта нотация показывает, что 1.504582 умножается на число 10, возведенное во вторую степень (Å+02). Å — это условное обозначение «экспоненты».

Значения, которые выводятся с использованием спецификаторов преобразования е, Е, и f, выводятся по умолчанию с точностью 6 разрядов после десятичной точки; другие значения точности могут быть заданы явным образом. Спецификатор преобразования f всегда выводит по меньшей мере одну цифру слева от десятичной точки. Спецификаторы преобразования е и Е печатают соответственно символ е нижнего регистра и символ Е верхнего регистра, после которого следует значение экспоненты, и всегда печатают точно одну цифру слева от десятичной точки.

Спецификатор преобразования g (G) выводит число в формате е (Е) или f без нулей справа (т.е. 1.234000 выводится как 1.234). В формате е (Е) значение числа выводится в том случае, если после его преобразования в экспоненциальную нотацию зна- чение экспоненты оказывается меньше -4, либо когда оно превышает или равно заданной точности представления (6 значащих цифр по умолчанию для g и G). В других случаях для вывода значения используются спецификатор преобразования f. Со спецификаторами g или G нули справа в дробной части выводимого значения не печатаются. Для вывода десятичной точки требуется по меньшей мере одна значащая цифра в дробной части. Со спецификацией преобразования %g значения 0.0000875, 8750000.0, 8.75, 87.50 и 875 печатаются как 8.75å-05, 8.75å+06, 8.75, 87.5 è 875. Значение 0.0000875 использует нотацию е, поскольку после преобразования в экспоненциальный формат значение экспоненты оказывается меньше -4. Для вывода значения 8750000.0 также используется нотация е, так как значение экспоненты равно точности представления, задаваемой по умолчанию.

Точность представления для спецификаторов преобразования g и G показывает максимальное число печатающихся знача- щих цифр, включая цифру слева от десятичной точки. С использованием спецификации %g значение 1234567.0 будет напечатано как 1.23457å+06 (помните, что все спецификаторы преобразования значений с плавающей точкой имеют по умолчанию точность представления, равную 6). Обратите внимание, что выведенный результат содержит 6 значащих цифр. Когда значение выводится в экспоненциальной нотации, разница между g и G аналогична разнице между е и Е: спецификатор g выводит символ нижнего регистра е, а спецификатор G выводит символ верхнего регистра Е.

/*

Печать

чисел с плавающей

точêой с использованием

 

специфиêаторов

преобразования

значений с плавающей точêой

*/

#include

<stdio.h>

 

 

main () {

 

 

 

 

 

printf("%e\n",

1234567.89);

 

 

 

printf("%e\n",

+1234567.89);

 

 

 

printf("%e\n",

-1234567.89);

 

 

 

printf("%E\n",

1234567.89);

 

 

 

printf("%f\n",

1234567.89);

 

 

 

printf("%g\n",

1234567.89);

 

 

 

printf("%G\n",

1234567.89);

 

 

 

return

0; }

 

 

 

1.234568e+06

1.234568e+06

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

4

-1.234568e+06

 

 

 

 

 

1.234568E+06

 

 

 

 

 

1234567.890000

 

 

 

 

 

1.23457e+06

 

 

 

 

 

1.23457E+06

 

 

 

 

 

/* Применение специфиêаторов преобразования р, n, и % */

 

#include <stdio.h>

 

 

 

 

 

main (){

 

 

 

 

 

 

 

int *ptr;

 

 

 

 

 

 

int x = 12345, y;

 

 

 

 

 

ptr = &x;

 

 

 

 

 

 

printf("The value of ptr is %p\n", ptr);

 

 

printf("The address of x is %p\n", &x);

 

 

printf("Total characters printed on this line is:%n", &y);

 

 

printf{" %d\n\n", y);

 

 

 

 

 

y = printf("This line has 28 characters\n");

 

 

printf("%d characters were printed\n", y);

 

 

printf("Printing a %% in a format control string\n");

 

 

return 0; }

 

 

 

 

 

The value of ptr is 001F2BB4

 

 

 

The address of x is 001F2BB4

 

 

 

Total characters printed on this line is: 41

 

This line has 28 characters

 

 

 

8 characters were printed

 

 

 

 

Printing a % in a format control string

 

/* Выравнивание строê по правомó и по левомó êраю поля */

 

#include <stdio.h>

 

 

 

 

 

main () {

 

 

 

 

 

 

 

printf("%l0s%l0d%l0c%l0f\n\n", "hello", 7, 'a', 1.23);

 

 

printf("%-l0s%-l0d%-l0c%-l0f\n", "hello", 7, 'a', 1.23);

 

 

return 0; }

 

 

 

 

 

 

hello

 

7

a

1.230000

 

 

hello

7

a

1.230000

 

 

/* Печать чисел с флаãом + и без неãо */

 

#include <stdio.h>

 

 

 

 

 

main () {

 

 

 

 

 

 

 

printf("%d\n%d\n", 786, -786);

 

 

 

printf("%+d\n%+d\n", 786, -786);

 

 

 

return 0; }

 

 

 

 

 

786

 

 

 

 

 

 

-786

 

 

 

 

 

 

+786

 

 

 

 

 

 

-786

 

 

 

 

 

 

/*

Использование

флаãа

#

со

специфиêаторами преобразования о,

х, X

и любым специфиêатором

значений с

плавающей точêой */

 

#include

<stdio.h>

 

 

 

 

main () {

 

 

 

 

 

 

int c= 1427; float p = 1427.0;

printf("%#o\n", c); printf("%#x\n", c); printf("%#X\n", c); printf("%g\n", p); printf ("%#g\n", p); return 0; }

02623

0x593

0X593

1427

1427.00

Форматный ввод из входного потока.

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

1.Ввод всех типов данных.

2.Ввод определенных символов из входного потока.

3.Пропуск определенных символов из входного потока. Прототип функции scanf() имеет вид:

int scanf(const char * format,. ..);

При обращении к функции scanf() возможны две формы задания первого параметра: int scanf ( форматная_строêа, списоê_арãóментов );

int scanf ( óêазатель_на_форматнóю_строêó, списоê_арãóментов);

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

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

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

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

ния точно указано количество вводимых символов.

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

5

Функция scanf( ) завершает работу, если исчерпана форматная строка. При успешном завершении scanf() возвращает количество преобразованных и введенных полей (точнее, количество объектов, получивших значения при вводе). Значение EOF возвращается при возникновении ситуации "конец файла"; значение -1 - при возникновении ошибки преобразования данных.

Форматная строка ограничена двойными кавычками и может включать:

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

обычные символы, отличные от пробельных и символа '%'. Обработка обычного символа из форматной строки сводится к чтению очередного символа из входного потока. Если прочитанный символ отличается от обрабатываемого символа форматной строки, функция завершается с ошибкой. Несовпавший символ и следующие за ним входные символы остаются непрочитанными;

спецификации преобразования.

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

% * ширина_поля модифиêатор специфиêатор

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

та во входном потоке.

Необязательные элементы спецификации преобразования имеют следующий смысл:

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

Ширина_поля - положительное десятичное целое, определяющее максимальное число символов, которое может быть про- читано из входного потока. Фактически может быть прочитано меньше символов, если встретится пробельный символ или символ, который не может быть преобразован по заданной спецификации.

 

Модификатор - позволяет задать длину переменной, в которую предполагается поместить вводимое значение.

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

Описание

 

 

 

Целые

 

 

d

 

 

Прочитать десятичное целое число с необязательным знаком. Соответствующий аргумент —

 

 

 

указатель на целое число.

i

 

 

Прочитать десятичное, восьмеричное или шестнадцатеричное целое число с необязательным

 

 

 

знаком. Соответствующий аргумент - указатель на целое число.

o

 

 

Прочитать восьмеричное число. Соответствующий аргумент - указатель на целое число без зна-

 

 

 

êà.

u

 

 

Прочитать десятичное целое число без знака. Соответствующий, аргумент - указатель на целое

 

 

 

число без знака.

x èëè X

 

Прочитать шестнадцатеричное число. Соответствующий аргумент -указатель на целое число без

 

 

 

знака.

h èëè l

 

Помещается перед любым спецификатором преобразования целых, чтобы показать, что вводится

 

 

 

целое соответственно типа short или long.

Числа с плавающей точкой

 

å,

Å,

f, g èëè G

Прочитать значение с плавающей точкой. Соответствующий аргумент -указатель на переменную

 

 

 

с плавающей точкой.

l

èëè

L

Помещается перед любым спецификатором преобразования значений с плавающей точкой, чтобы

 

 

 

показать, что вводится значение типа double или long double.

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

 

ñ

 

 

Прочитать символ. Соответствующий аргумент — указатель на char. Нулевой символ ('\0') не

 

 

 

добавляется.

s

 

 

Прочитать строку. Соответствующий аргумент — указатель на массив типа char. Массив должен

 

 

 

иметь достаточный размер для хранения строки и ограничивающего нулевого символа ('\0')-

Набор сканирования

 

[ символы]

Сканирование входного потока и ввод символов, входящих в набор, с сохранением введенных

 

 

 

данных в массиве.

Разное

 

 

ð

 

 

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

 

 

 

ром %р в операторе printf.

n

 

 

Сохранить число символов, введенных до настоящего момента данным оператором scanf. Соот-

 

 

 

ветствующий аргумент - указатель на целое.

%

 

 

Пропустить при вводе знак процента (%).

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

/* Чтение целых чисел */ #include <stdio.h>

main () {

int a, b, c, d, e, f, g; printf("Enter seven integers: ");

scanf("%d%i%i%i%o%u%x", &a, &b, &c, &d, &e, &f, &g); printf("The input displayed as decimal integers is:\n"); printf("%d %d %d %d %d %d %d\n", a, b, c, d, e, f, g); return 0;

}

Enter seven integers: -70 -70 070 0x70 70 70 70 The input displayed as decimal integers is: -70 -70 56 112 56 70 112

При вводе чисел с плавающей точкой может быть использован любой из спецификаторов преобразования значений с плавающей точкой: е, Е, f, g или G. Программа на рис. 9.19 читает три числа с плавающей точкой с тремя видами спецификаторов преобразования и выводит их со спецификатором преобразования f. Обратите внимание, что результат исполнения программы подтверждает тот факт, что выведенные значения с плавающей точкой не являются точными. Об этом свидетельствует второе по счету напечатанное значение.

Лысый Д.А. Основы программирования. Ввод, вывод, потоки, файлы. часть1

6

/* Чтение значений с плавающей точêой */ #include <stdio.h>

main () {

float a, b, c;

printf("Enter three floating-point numbers: \n"); scanf("%e%f%g", &a, &b, &c);

printf("Here are the numbers entered in plain\n"); printf ("floating-point notation:\n");

printf("%f %f %f\n", a, b, c); return 0;

}

Enter three floating-point numbers: 1.27987 1.27987e+03 3.38476e-06

Here are the numbers entered in plain floating-point notation

1.279870

1279.869995

0.000003

Символы и строки вводятся с использованием спецификаторов преобразования соответственно с и s. Следующая программа предлагает пользователю ввести строку. Программа считывает первый символ строки со спецификацией %с и сохраняет его в символьной переменной х; затем вводит оставшуюся часть строки со спецификацией %s и сохраняет ее в массиве символов у.

/* Чтение символов и строê */ #include <stdio.h>

main () {

char x, y[9];

printf("Enter a string: "); scanf("%c%s", &x, y); printf("The input was:\n");

printf("the character \"%c\" ", x); printf("and the string \"%s\"\n", y); return 0;

}

Enter a string: Sunday The input was:

the character "S" and the string "unday"

Последовательность символов можно ввести, используя набор сканирования. Набор сканирования — это список символов, заключенный в квадратные скобки [], следующий сразу за знаком процента в строке управления форматом. Набор сканирования просматривает символы во входном потоке, выбирая только те из них, которые содержатся в наборе символов. Каждый раз при совпадении символа он сохраняется в соответствующем аргументе набора сканирования. Аргумент — это указатель на массив символов. Набор сканирования прекращает читать символы после того, как встречается символ, не содержащийся в наборе. Если уже первый символ входного потока не соответствует ни одному из символов набора, то в массиве сохраняется только нулевой символ.

/* Применение набора сêанирования */ #include <stdio.h>

main () { char z[9] ;

printf("Enter a string: "); scanf("%[aeiou]", z);

printf("The input was \"%s\"\n", z); return 0; }

Enter a string: ooeeooahah The input was "ooeeooa"

Набор сканирования можно также использовать для ввода символов, не содержащихся в заданном списке, если применить инвертированный набор сканирования. Чтобы инвертировать набор символов, поместите символ ^ в квадратные скобки перед первым символом набора. В этом случае в массиве будут сохраняться только те символы, которые не входят в набор. Инвертированный набор завершает ввод после появления во входном потоке символа, который имеется в наборе. Например, можно использовать набор [^aeiou] для поиска во входном потоке символов, не являющихся гласными.

Часто бывает необходимо пропустить некоторые символы входного потока. Например, дата могла бы быть введена как

7-9-91

Каждое число даты требуется сохранить, но символы тире, которыми они; разделены, могут быть отброшены. Чтобы устранить ненужные символы, включите их в строку управления форматом scanf (пробельные символы — пробел, новая строка и табуляция — пропускают все пробельные символы, предшествующие значимым данным). Например, чтобы пропустить символы; тире при вводе даты, используйте оператор

scanf ("%d-%d-%d", Smonth, Sday, Syear);

Õîòÿ scanf и устраняет тире в предыдущем примере, дата может быть введена и в следующем формате: 7/9/91

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

/* Чтение и отбрасывание символов из входноãо потоêа */ #include <stdio.h>

main() {

int monthl, dayl, yearl, month2, day2, year2; printf("Enter а date in the form mm-dd-yy: "); scanf("%d%*c%d%*c%d", &monthl, &dayl, &yearl);

printf("month = %d day = %d year = %d\n\n", monthl, dayl, yearl); printf("Enter а date in the form mm/dd/yy: "); scanf("%d%*c%d%*c%d", &month2, &day2, &year2);

printf("month = %d day = %d year = %d\n", month2, day2, year2); return 0;

}

Enter а date in the form mm-dd-yy: 11-18-71 month = 11 day = 18 year = 71 Enter а date in the form mm/dd/yy: 11/18/71 month = 11 day = 18 year = 71

Соседние файлы в папке C_I_семестр