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

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

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

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

Форматная строка состоит из трех типов символов:

  • Спецификаторы формата

  • Специальные символы

  • Стандартные символы

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

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

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

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

Код

Значение

%c

%d

%i

%е

%f

%g

%o

%s

%u

%x

%p

%n

%[]

Читает одиночные символы

Читает десятичное число

Читает десятичное число

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

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

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

Читает восьмеричное число

Читает строку

Читает беззнаковое целое

Читает шестнадцатиричное число

Читает указатель

Получает целочисленное значение, равное числу прочитанных символов

Сканирует множество символов

Ввод чисел

Традиционно для чтения десятичного числа используются спецификаторы %d или %i.

Для чтения числа с плавающей точкой, представленного в стандартной или научной нотации, используются спецификаторы %e, %f или %g.

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

#include <stdio.h>

int main(void)

{

int i, j;

scanf(“%o%x”, &i, &j);

printf(“%o %x”, i, j);

}

Ввод беззнаковых целых

Для ввода беззнаковых целых используется спецификатор формата %u. Например:

unsigned num;

scanf(“%u”, &num);

Чтение одиночных символов

Как показано ранее, можно читать отдельные символы, используя функции getchar() или getche(). Для этих целей также можно использовать и scanf(), для чего нужно указать спецификатор формата %с.

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

scanf(“%c%c%c”, &a, &b, &c);

вернет символ х в а, пробел в b и символ у в с.

Чтение строк

Функция scanf() может использоваться для чтения строк и потока ввода, для чего надо указать спецификатор формата %s. %s заставляет функцию scanf() читать символы, пока не встретится специальный символ. Прочитанные символы помещаются в массив символов, на который указывает соответствующий аргумент, и результат завершается нулевым пробелом. Применительно к scanf() специальные символы – это пробел, новая строка, табуляция, вертикальная табуляция или перевод формата. В противоположность gets(), которая читает строку, пока не встретиться возврат каретки (нажатие <Enter>), функция scanf() читает строку до первого специального символа. Это означает, что нельзя использовать scanf() для чтения строки типа «this is a test», поскольку первый пробел завершит процесс ввода.

Ввод адреса

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

#include <stdio.h>

int main(void)

{

char *p;

printf(“Enter an adress: ”);

scanf(“%p”, &p);

printf(“Value at location %p is %c\n”, p, *p);

}

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

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

Использование множества сканирования

Функция scanf() поддерживает спецификатор формата общего назначения, называемый множеством сканирования. Множество сканирования определяет набор символов. Когда scanf() обрабатывает множество сканирования, она вводит символы до тех пор, пока символы являются частью множества сканирования. Читаемые символы сохраняются в символьном массиве, на который указывает соответствующий аргумент. Для определения множества сканирования необходимо поместить сканируемые символы в квадратные скобки. Открываемой квадратной скобке должен предшествовать %. Например, следующее множество сканирования сообщает функции scanf() о необходимости только чтения символов X, Y и Z:

%[XYZ]

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

#include <stdio.h>

int main(void)

{

int i;

char str[80], str2[80];

scanf(“%d%[abcdefg]%s”, &i, str, str2);

printf(“%d %s %s”, i, str, str2);

}

Введем 123abcdtye, после чего нажмем <Enter>. Программа отобразит 123 abcd tye. Поскольку символ «t» не является частью множества сканирования, scanf() останавливает чтение символов в str при обнаружении «t». Оставшиеся символы помещаются в str2.

Можно указать диапазоны множества сканирования, используя дефис. Например, следующая команда говорит функции scanf() о необходимости чтения символов от «А» до «Z»:

%[A-Z]

Пропуск нежелательных специальных символов

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

Обычные символы в управляющей строке

Обычные символы в управляющей строке заставляют функцию scanf() читать и отбрасывать соответствующие символы из потока ввода. Например, “%d,%d” заставляет функцию scanf() прочитать целое число, прочитать и пропустить запятую, а затем начать читать другое целое число. Если указанный символ не найден, то функция scanf() завершает работу.

В scanf() следует передавать адреса

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

scanf(“%d”, &count);

Строки будут читаться в массивы символов, причем имя массива (без индексов) является адресом первого элемента массива. Таким образом, для чтения строки в символьный массив str следует использовать

scanf(“%s”, str);

В данном случае str является указателем и нет необходимости ставить перед ним оператор &.

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

Как функция printf(), так и функция scanf() допускают наличие нескольких спецификаторов формата, немного изменяющих ввод.

Спецификаторы формата могут содержать модификатор максимальной длины поля. Это целое число, помещаемое между % и спецификатором формата, ограничивающее число символов, читаемых в поле. Например, для чтения не более 20 символов в str следует написать:

scanf(“%20s”, str);

Если поток ввода содержит более 20 символов, последующее обращение к вводу начнется с места, где было завершено предыдущее обращение. Например, если ввести

ABCDEFGHIJKLMNOPQRSTUVWXYZ

В ответ на запрос функции , приведенной в предыдущем примере, в str поместятся только 20 символов (включая «Т») из-за наличия спецификатора максимальной ширины поля. Это означает, что оставшиеся символы UVWXYZ не были использованы. Если вызвать еще одну scanf() , например:

scanf(“%s”, str);

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

Для чтения длинных целых следует поместить l перед спецификатором формата. Для чтения коротких целых следует поместить h перед спецификатором формата. Данные модификаторы могут использоваться с кодами формата d, i, o, u и х.

По умолчанию спецификаторы f, e и g сообщают о необходимости присвоения данной переменной типу float. Если поместить перед одним из этих спецификаторов l , то scanf() присвоит данные типу double. Использование L сообщает о необходимости представления полученных данных как long double.

Подавление ввода

Можно заставить scanf() прочитать поле, но не присвоить его какой-либо переменной, поставив перед кодом формата поля *. Например, имея

scanf(“%d%*c%d”, &x, &y);

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

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