Функция ввода информации с клавиатуры scanf()
Для ввода данных любого типа с клавиатуры используется стандартная функция scanf(...), обращение к которой таково:
scanf("форматная строка", &arg1,&arg2,....);
Ее основное достоинство в том, что она позволяет вводить данные всех базовых типов. В форматной строке имеет смысл записывать только спецификации преобразования формата ввода аргументов, причем используются практически те же спецификаторы формата, что и в функции printf().
Предупреждение. Ввод по scanf() часто при- водит к неверному результату, если пользо- ватель отклоняется от шаблона формата. По- этому надежнее усложнить способ ввода, ис- пользуя другие функции, например, gets() и sscanf().
Обратите особое внимание на то, что за форматной строкой перечисляются не аргументы, а их адреса! Это сделано потому, что задачей функции является изменение значения объекта, для чего необходимо знать именно его адрес. Например:
int a,b; scanf("%d %d",&a,&b);
Такой оператор означает, что программа ожидает ввода двух десятичных целых значений. Признаком окончания ввода первого числа будет нажатие клавиши Enter или пробела. Если хочется привводе разделять вводимые параметры запятой, то точно так же должны быть разделены и соответствующие спецификаторы формата:
scanf("%d,%d",&a,&b);
Если требуется ввести некоторую символьную строку, то для нее предварительно необходимо зарезервировать место:
char name[80]; scanf("%s",name);
Поскольку имя массива адекватно адресу его начала, то использование адресного оператора & здесь не требуется. Заметим, что в составе вводимой символьной строки не должно быть пробелов или символов табуляции. Первый же пробел рассматривается функцией scanf() как конец вводимой строки, однако начальные пробелы и символы табуляции игнорируются.
Можно считать, что функция scanf() воспринимает отдельные слова, а не предложения. Поэтому если вы вводите только текст, то удобнее применять функцию gets(). Она воспринимает вводимый текст, включая пробелы, вплоть до нажатия клавиши Enter. Конечно, если заранее известно количество вводимых слов, то можно заставить правильно работать и функцию scanf() - достаточно записать спецификацию %s для каждого отдельного слова. Итак, функция scanf() использует пробел, символы табуляции и новой строки для разбиения входного потока символов на отдельные поля. Она сама согласует последовательность спецификаторов с перечнем полей. Единственным исключением из этого правила является спецификация %c, приводящая к чтению к а ж д о г о следую- щего символа, даже если он является пробелом. Особо подчеркнем, что при вводе вещественных чисел типа double по форматам %f или %e о б я з а т е л ь н о использовать в формате префикс l (прописная латинская буква "эль"!!), иначе ввод будет неверен:
double a; ......... scanf("%lf",&a);
И еще одна неприятная особенность функции scanf(). Ввод числа, как известно, всегда завершается нажатием клавиши Enter. При этом функции scanf() передается символ '\n'. Она считывает все символы до него, интерпретируя их как некоторое число, но сам символ '\n' остается в буфере клавиатуры! При последующем вызове функции scanf() чтение начнется именно с этого символа, что приведет к неверному вводу. Поэтому рекомендуется перед вызовом функции scanf() очищать буфер клавиатуры. Это можно сделать различными способами, например, обращением к библиотечной функции очистки буфера стандартного устройства ввода fflush(stdin).
Многие программисты не любят функцию scanf() за ее "скверный характер" и предпочитают создавать собственные функции для ввода чисел желаемого типа.
Обычно это делается в два этапа. Сначала производится ввод числа как обычной символьной строки функцией gets(), которая помещает введенные символы в заранее зарезервированный буфер. Затем производится преобразование содержимого буфера в число требуемого типа при помощи стандартных функции преобразования:
int atoi(char *buffer) - в целое число; long atol(char *buffer) - в длинное целое число; double atof(char *buffer) - в вещественное число.
Приведем пример такой функции ввода вещественного числа:
#include<stdio.h> #include<stdlib.h>
double f_accept(void) { char buf[20]; /* Буфер для ввода строки */ printf(“Введи вещественное число - ”); // Подсказка для ввода gets(buf); return atof(buf); }
Рекомендуем вам запомнить этот надежный способ.
Читайте также: G) ограниченная функция снизу и сверху Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|