Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 3:

Переменные и базовые типы данных языка С

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Прототип функции getchar() имеет следующий вид:

int getchar(void);

Функция getchar() возвращает из стандартного потока stdin (входного потока данных) следующий символ. При чтении символа предполагается, что символ имеет тип unsigned char, который потом преобразуется в целый. При достижении конца файла, как и при обнаружении ошибки, функция getchar() возвращает значение EOF (End Of File – конец файла).

Прототип функции gets имеет следующий вид:

char *gets(char *str);

Функция gets() читает символы (включая пробелы) из стандартного потока stdin и помещает их в массив символов, адресуемый указателем *str (далее это массив символов). Символы читаются до тех пор, пока не встретится разделитель строк или значение EOF. Для реализации EOF на клавиатуре следует набрать одновременно Ctrl+Z. Вместо разделителя строк в конец строки вставляется нулевой символ, свидетельствующий о ее завершении. Следует учесть, что нет способа ограничить количество символов, которое прочитает функция gets(). Поэтому массив, адресуемый указателем *str, может переполниться, и тогда программа выдаст непредсказуемые результаты.

Прототип функции scanf() имеет следующий вид:

int scanf(const char *format, ?);

Функция scanf() представляет собой функцию для ввода данных общего назначения, которая читает поток stdin и сохраняет информацию в переменных, перечисленных в списке аргументов. Если в строке форматирования встретится разделитель, то функция scanf() пропустит один или несколько разделителей во входном потоке. Под разделителем, или пробельным символом, подразумевают пробел, символ табуляции \t или разделитель строк \n. Все переменные должны передаваться посредством своих адресов, например, с помощью символа &. Управляющая строка, задаваемая параметром format, состоит из символов трех категорий: спецификаторов формата, пробельных символов, символов, отличных от пробельных [2.4].

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

Таблица 2.4.
Спецификаторы формата функции scanf()
Код Формат
%c Читает один символ
%d Читает десятичное целое число
%i Читает целое число в любом формате (десятичное, восьмеричное или шестнадцатеричное)
%u Читает десятичное целое число типа short int
%e Читает число с плавающей точкой (и в экспоненциальной форме)
%E Аналогично коду %e
%f Читает число с плавающей точкой
%lf Читает десятичное число с плавающей точкой типа double
%F Аналогично коду %f (для стандарта С99)
%g Читает число с плавающей точкой.
%G Аналогично коду %g
%o Читает восьмеричное число
%x Читает шестнадцатеричное число
%X Аналогично коду %x
%s Читает строку
%p Читает указатель
%n Принимает целое значение, равное количеству прочитанных до сих пор символов
%[ ] Просматривает набор символов
%% Читает знак процента

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

В программах бывает необходимость определять константы. В языке С типы констант можно задавать явно при использовании суффиксов. Например:

long int  j = –12345678L;      /* суффикс L */
unsigned int a = 678U;         /* суффикс U */
float x = 123.45F;             /* суффикс F */
long double z = 12345678.99L;  /* суффикс L* /

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

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

В таких средах разработки как MS Visual Studio 2008 и 2010 рекомендуется для безопасной работы применять функции gets_s() и scanf_s(). Для этих функций при чтении символа или строки следует указать размер в байтах, соответственно для символа или строки. Например, scanf_s("%c", &ch, 1). В Visual Studio 2010 тип данных char занимает 1 байт.

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
помогите пожалуйста. не могу скачать ms. visual studio
Роман Островский
Роман Островский
Украина
Олег Корсак
Олег Корсак
Латвия, Рига