Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_si.doc
Скачиваний:
13
Добавлен:
12.11.2018
Размер:
11.78 Mб
Скачать

Ввод-вывод строк.

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

char * gets(char * s); /* Функция ввода */

int puts(char * s); /* Функция вывода */

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

Функция puts( ) в случае успешного завершения возвращает последний выведенный символ, который всегда является символом '\n'. Если произошла ошибка, то возвращается EOF.

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

Напомним, что любая строка символов в языке Си должна заканчиваться нуль-символом '\0'. В последний элемент массива strl нуль-символ будет записан автоматически во время трансляции при инициализации массива. Для функции puts( ) наличие нуль-символа в конце строки является обязательным. В противном случае, т.е. при отсутствии в символьном массиве символа '\0', программа может завершиться аварийно, так как функция puts( ) в поисках нуль-символа будет перебирать всю доступную память байт за байтом, начиная в нашем примере с адреса strl. Об этом необходимо помнить, если в программе происходит формирование строки для вывода ее на экран дисплея. Функция gets( ) завершает свою работу при вводе символа '\n', который автоматически передается от клавиатуры в ЭВМ при нажатии на клавишу <Enter>. При этом сам символ '\n' во вводимую строку не записывается. Вместо него в строку помещается нуль-символ '\0'. Таким образом, функция gets( ) производит ввод "правильной" строки, а не просто последовательности символов.

Здесь следует обратить внимание на следующую особенность ввода данных с клавиатуры. Функция gets( ) начинает обработку информации от клавиатуры только после нажатия клавиши <Enter>. Таким образом, она "ожидает", пока не будет набрана нужная информация и нажата клавиша <Enter>. Только после этого начинается ввод данных в программу.

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

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

Для работы со стандартными потоками в режиме форматного

ввода-вывода определены две функции.

printf( ) - форматный вывод;

scanf( ) - форматный ввод.

Форматный вывод в стандартный выходной поток. Прототип функции printf( ) имеет вид:

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

При обращении к функции printf( ) возможны две формы задания первого параметра:

int printf ( форматная строка, список_аргументов};

int printf (указатель на_форматную_строку, список аргументов);

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

Возвращаемое значение функции printf( ) - число напечатанных символов; а в случае ошибки - отрицательное число.

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

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

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

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

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

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

d

int, char,

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

unsigned

i

int, char,

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

unsigned

u

int, char,

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

unsigned

0

int, char,

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

unsigned

x

int, char,

Шестнадцатеричное целое без знака; при выводе ис-

unsigned

пользуются символы "0...9a...f

X

int, char,

Шестнадцатеричное целое без знака; при выводе ис-

unsigned

пользуются символы "0...9A...F

f

double,

Вещественное значение со знаком в виде:

float

знак _числаdudd.dddd,

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

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

е

double, float

Вещественное значение в виде:

знак числаm.ddddeзнакxxx,

где m.dddd - изображение мантиссы числа;

m - одна десятичная цифра;

dddd - последовательность десятичных цифр;

е - признак порядка;

знак - знак порядка;

ххх - десятичные цифры для представления порядка числа;

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

Е

double, float

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

g

double, float

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

G

double, float

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

с

int, char, unsigned

Одиночный символ

S

char *

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

р

void *

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


Список_аргументов (с предшествующей запятой) может отсутствовать.

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

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

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

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

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

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

Таблица 7.1