Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


A12.7. Генерация сообщения об ошибке



Строка препроцессора вида

#error последовательность-лексемнеоб

приказывает ему выдать диагностическое сообщение, включающее заданную последовательность лексем.

A12.8. Прагма

Управляющая строка вида

#pragma последовательность-лексемнеоб

призывает препроцессор выполнить зависящие от реализации действия. Неопознанная прагма игнорируется.

A12.9. Пустая директива

Строка препроцессора вида

#

не вызывает никаких действий.

A12.10. Заранее определенные имена

Препроцессор " понимает" несколько заранее определенных идентификаторов; их он заменяет специальной информацией. Эти идентификаторы (и оператор препроцессора defined в том числе) нельзя повторно переопределять, к ним нельзя также применять директиву #undef. Это следующие идентификаторы:

__LINE__ Номер текущей строки исходного текста, десятичная константа.__FILE__ Имя компилируемого файла, строка.__DATE__ Дата компиляции в виде " MMM DD YYYY", строка.__TIME__ Время компиляции в виде " hh: mm: ss", строка.__STDC__ Константа 1. Предполагается, что этот идентификатор определен как 1 только в тех реализациях, которые следуют стандарту.

Строки #error и #pragma впервые введены ANSI-стандартом. Заранее определенные макросы препроцессора также до сих пор не описывались, хотя и использовались в некоторых реализациях.

A13. Грамматика

Ниже приведены грамматические правила, которые мы уже рассматривали в данном приложении. Они имеют то же содержание, но даны в ином порядке.

Здесь не приводятся определения следующих символов-терминов: целая-константа, символьная-константа, константа-с-плавающей-точкой, идентификатор, строка и константа-перечисление. Слова, набранные обычным латинским шрифтом (не курсивом), и знаки рассматриваются как символы-термины и используются точно в том виде, как записаны. Данную грамматику можно механически трансформировать в текст, понятный системе автоматической генерации грамматического распознавателя. Для этого помимо добавления некоторых синтаксических пометок, предназначенных для указания альтернативных продукций, потребуется расшифровка конструкции со словами " один из" и дублирование каждой продукции, использующей символ с индексом необ., причем один вариант продукции должен быть написан с этим символом, а другой - без него. С одним изменением, а именно - удалением продукции typedef-имя: идентификатор и объявлением typedef-имени символом-термином, данная грамматика будет понятна генератору грамматического распознавателя YACC. Ей присуще лишь одно противоречие, вызываемое неоднозначностью конструкции if-else.

единица–трансляции: внешнее-объявление единица-трансляции внешнее-объявление внешнее-объявление: определение-функции объявление определение функции: спецификаторы-объявлениянеоб объявитель список-объявленийнеоб составная-инструкция объявление: спецификаторы-объявления список-инициализаторов-объявителейнеоб список-объявлений: объявление список-объявлений объявление спецификаторы-объявления: спецификатор-класса-памяти спецификаторы-объявлениянеоб спецификатор-типа спецификаторы-объявлениянеоб квалификатор-типа спецификаторы-объявлениянеоб спецификатор-класса-памяти: один из auto register static extern typedef спецификатор-типа: один из void char short int long float double signed unsigned спецификатор-структуры-или-объединения спецификатор-перечисления typedef-имя квалификатор-типа: один из const volatile спецификатор-структуры-или-объединения: структуры-или-объединения-идентификаторнеоб { список-объявлений-структуры } структуры-или-объединения идентификатор структура-или-объединение: одно из struct union список-объявлений-структуры: объявление-структуры список-объявлений-структуры объявление-структуры список-объявителей-ииициализаторов: объявитель-инициализатор список-объявителей-инициализаторов, объявитель-инициализатор объявитель-инициализатор: объявитель объявитель = инициализатор объявление-структуры: список-спецификаторов-квалификаторов список-объявителей-структуры список-спецификаторов-квалификаторов: спецификатор-типа список-спецификаторов-квалификаторовнеоб квалификатор-типа список-спецификаторов-квалификаторовнеоб список-структуры-объявителей: структуры–объявитель список-структуры-объявителей, структуры-объявитель структуры-объявитель: объявитель объявительнеоб: константное-выражение спецификатор-перечисления: enum идентификаторнеоб { список-перечислителей } enum идентификатор список-перечислителей: перечислитель список-перечислителей перечислитель перечислитель: идентификатор указательнеоб собственно-объявитель собственно-объявитель: идентификатор ( объявитель ) собственно-объявитель [ константное-выражениенеоб ] собственно-объявитель ( список-типов-параметров ) собственно-объявитель ( список-идентификаторовнеоб ) указатель: * список~квалификаторов-типанеоб * список-квалификаторов-типанеоб указатель список-квалификаторов-типа: квалификатор-типа список-квалификаторов-типа квалификатор-типа список-типов-параметров: список-параметров список-параметров, ... список-параметров: объявление-параметра список-параметров, объявление-параметра объявление-параметра: спецификаторы-объявления объявитель спецификаторы-объявления абстрактный-объявительнеоб список-идентификаторов: идентификатор список-идентификаторов, идентификатор инициализатор: выражение-присваивания { список-инициализаторов } { список-инициализаторов, } список-инициализаторов: инициализатор список-инициализаторов, инициализатор имя-типа: список-спецификаторое-квалификаторов абстрактный-объявительнеоб абстрактный-объявитель: указатель указательнеоб собственно-абстрактный-объявитель собственно-абстрактный-объявитель: ( абстрактный-объявитель ) собственно-абстрактный-объявительнеоб [константное-выражениенеоб] собственно-абстрактный-объявительнеоб (список-типов-параметровнеоб) typedef-имя: идентификатор инструкция: помеченная-инструкция инструкция–выражение составная-инструкция инструкция-выбора циклическая-инструкция инструкция-перехода помеченная-инструкция: идентификатор: инструкция case константное-выражение: инструкция default: инструкция инструкция-выражение: выражениенеоб; составная-инструкция: ( список-объявленийнеоб список-инструкцийнеоб) список-инструкций: инструкция список-инструкций инструкция инструкция-выбора: if ( выражение ) инструкция if ( выражение ) инструкция else инструкция switch ( выражение ) инструкция циклическая-инструкция: while ( выражение ) инструкция do инструкция while ( выражение ) return выражениенеоб; выражение: выражение-присваивания выражение, выражение-присваивания выражение-присваивания: условное-выражение унарное-выражение оператор-присваивания выражение-присваивания оператор-присваивания: один из = *= /= %= += -= < < = > > = & = ^= |= условное-выражение: логическое-ИЛИ-выражение логическое-ИЛИ-выражение? выражение: условное-выражение константное-выражение: условное-выражение логическое-ИЛИ-выражение: логическое-И-выражение логическое-ИЛИ-выражение || логическое-И-выражение логическое-И-выражение: ИЛИ-выражение логическое-И-выражение & & ИЛИ-выражение ИЛИ-выражение: исключающее-ИЛИ-выражение ИЛИ-выражение | исключающее-ИЛИ-выражение исключающее-ИЛИ-выражение: И-выражение исключающее-ИЛИ-выражение ^ И-выражение И-выражение: выражение-равенства И-выражение & выражение-равенства выражение-равенства: выражение-отношения выражение-равенства == выражение-отношения выражение-равенства! = выражение-отношения выражение-отношения: сдвиговое-выражение выражение-отношения < сдвиговое-выражение выражение-отношения > сдвиговое-выражение выражение-отношения < = сдвиговое-выражение выражение-отношения > = сдвиговое-выражение сдвиговое-выражение: аддитивное-выражение сдвиговое-выражение > > аддитивное-выражение сдвиговое-выражение < < аддитивное-выражение аддитивное-выражение: мультипликативное-выражение аддитивное-выражение + мультипликативное-выражение аддитивное-выражение - мультипликативное-выражение мультипликативное-выражение: выражение-приведенное-к-типу мультипликативное-выражение * выражение-приведенное-к-типу мультипликативное-выражение / выражение-приведенное-к-типу мультипликативное-выражение % выражение-приведенное-к-типу выражение-приведенное-к-типу: унарное-выражение ( имя-типа ) выражение-приведенное-к-типу унарное-выражение: постфиксное –выражение ++ унарное-выражение -- унарное-выражение унарный-оператор выражение-приведенное-к-типу sizeof унарное-выражение sizeof( имя-типа ) унарный-оператор: один из & * + - ~! постфиксное-выражение: первичное-выражение постфиксное-выражение [ выражение ] постфиксное-выражение ( список-аргументов-выраженийнеоб ) постфиксное-выражение, идентификатор постфиксное-выражение -> идентификатор постфиксное-выражение ++ постфиксное-выражениепервичное -выражение: идентификатор константа строка ( выражение ) список-аргументов-выражений: выражение-присваивания список-аргументов-выражений, выражение-присваивания константа: целая-константа символьная-константа константа-с-плавающей-точкой константа-перечисление

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

управляющая-строка: #define идентификатор последовательность-лексем #define идентификатор ( идентификатор, ..., идентификатор) последовательность-лексем #undef идентификатор #include < имя-файла> #include " имя-файла" #include последовательность-лексем #line константа " идентификатор" #line константа #error последовательность-лексемнеоб #pragma последовательность-лексемнеоб # условная-конструкция-препроцессора условная-конструкция-препроцессора: if-строка текст elif-части else-частьнеоб #endif if-строка: #if константное-выражение #ifdef идентификатор #ifndef идентификатор elif-части: elif-строка текст elif-частинеоб elif-строка: #elif константное-выражение else-часть: else-строка текст else-строка: #else

 

 

Содержание

Приложение B. Стандартная библиотека

B1. Ввод-вывод: < stdio.h>
B1.1. Операции над файлами
B1.2. Форматный вывод
B1.3. Форматный ввод
B1.4. Функции ввода-вывода символов
B1.5. Функции прямого ввода-вывода
B1.6. Функции позиционирования файла
B1.7. Функции обработки ошибок
B2. Проверки класса символа: < ctype.h>
B3. Функции, оперирующие со строками: < string.h>
B4. Математические функции: < math.h>
B5. Функции общего назначения: < stdlib.h>
B6. Диагностика: < assert.h>
B7. Списки аргументов переменной длины: < stdarg.h>
B8. Дальние переходы: < setjmp.h>
B9. Сигналы: < signal.h>
B10. Функции даты и времени: < time.h>
B11. Зависящие от реализации пределы: < limits.h> и < float.h>

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

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

< assert.h> < ctype.h> < errno.h> < float.h> < limits.h> < locale.h> < math.h> < setjmp.h> < signal.h> < stdarg.h> < stddef.h> < stdio.h> < stdlib.h> < string.h> < time.h>

Доступ к заголовочному файлу осуществляется с помощью строки препроцессора

#include < заголовочный файл>

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

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

 

B1. Ввод-вывод: < stdio.h>

 

Определенные в < stdio.h> функции ввода-вывода, а также типы и макросы составляют приблизительно одну треть библиотеки.

Поток - это источник или получатель данных; его можно связать с диском или с каким-то другим внешним устройством. Библиотека поддерживает два вида потоков: текстовый и бинарный, хотя на некоторых системах, в частности в UNIXe, они не различаются. Текстовый поток - это последовательность строк; каждая строка имеет нуль или более символов и заканчивается символом '\n'. Операционная среда может потребовать коррекции текстового потока (например, перевода '\n' в символы возврат-каретки и перевод-строки).

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

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

Когда программа начинает работу, уже открыты три потока: stdin, stdout и stderr.

 

B1.1. Операции над файлами

 

Ниже перечислены функции, оперирующие с файлами. Тип size_t - беззнаковый целочисленный тип, используемый для описания результата оператора sizeof.

FILE *fopen(const char *filename, const char *mode);

fopen открывает файл с заданным именем и возвращает поток или NULL, если попытка открытия оказалась неудачной. Режим mode допускает следующие значения:

" r" - текстовый файл открывается для чтения (от read (англ.) - читать);
" w" - текстовый файл создается для записи; старое содержимое (если оно было) выбрасывается (от write (англ.) - писать);
" а" - текстовый файл открывается или создается для записи в конец файла (от append (англ.) - добавлять);
" r+" - текстовый файл открывается для исправления (т. е. для чтения и для записи);
" w+" - текстовый файл создается для исправления; старое содержимое (если оно было) выбрасывается;
" a+" - текстовый файл открывается или создается для исправления уже существующей информации и добавления новой в конец файла.

Режим " исправления" позволяет читать и писать в один и тот же файл; при переходах от операций чтения к операциям записи и обратно должны осуществляться обращения к fflush или к функции позиционирования файла. Если указатель режима дополнить буквой b (например " rb" или " w+b" ), то это будет означать, что файл бинарный. Ограничение на длину имени файла задано константой FILENAME_MAX. Константа FOPEN_MAX ограничивает число одновременно открытых файлов.

FILE *freopen(const char *filename, const char *mode, FILE *stream);

freopen открывает файл с указанным режимом и связывает его с потоком stream. Она возвращает stream или, в случае ошибки, NULL. Обычно freopen используется для замены файлов, связанных с stdin, stdout или stderr, другими файлами.

int fflush(FILE *stream);

Применяемая к потоку вывода функция fflush производит дозапись всех оставшихся в буфере (еще не записанных) данных, для потока ввода эта функция не определена. Возвращает EOF в случае возникшей при записи ошибки или нуль в противном случае. Обращение вида fflush(NULL) выполняет указанные операции для всех потоков вывода.

int fclose(FILE *stream);

fсlose производит дозапись еще не записанных буферизованных данных, сбрасывает несчитанный буферизованный ввод, освобождает все автоматически запрошенные буфера, после чего закрывает поток. Возвращает EOF в случае ошибки и нуль в противном случае.

int remove(const char *filename);

remove удаляет файл с указанным именем; последующая попытка открыть файл с этим именем вызовет ошибку. Возвращает ненулевое значение в случае неудачной попытки.

int rename(const char *oldname, const char *newname);

rename заменяет имя файла; возвращает ненулевое значение в случае, если попытка изменить имя оказалась неудачной. Первый параметр задает старое имя, второй - новое.

FILE *tmpfile(void);

tmpfile создает временный файл с режимом доступа " wb+", который автоматически удаляется при его закрытии или обычном завершении программой своей работы. Эта функция возвращает поток или, если не смогла создать файл, NULL.

char *tmpnam(char s[L_tmpnam]);

tmpnam (NULL) создает строку, не совпадающую ни с одним из имен существующих файлов, и возвращает указатель на внутренний статический массив. tmpnam(s) запоминает строку в s и возвращает ее в качестве значения функции; длина s должна быть не менее L_tmpnam. При каждом вызове tmpnam генерируется новое имя; при этом гарантируется не более TMPMAX различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл.

int setvbuf(FILE *stream, char *buf, int mode, size_t size);

setvbuf управляет буферизацией потока; к ней следует обращаться прежде, чем будет выполняться чтение, запись или какая-либо другая операция, mode со значением _IOFBF вызывает полную буферизацию, с _IOLBF - " построчную" буферизацию текстового файла, a mode со значением _IONBF отменяет всякую буферизацию. Если параметр buf не есть NULL, то его значение - указатель на буфер, в противном случае под буфер будет запрашиваться память. Параметр size задает размер буфера. Функция setvbuf в случае ошибки выдает ненулевое значение.

void setbuf(FILE *stream, char *buf);

Если buf есть NULL, то для потока stream буферизация выключается. В противном случае вызов setbuf приведет к тем же действиям, что и вызов (void) setvbuf (stream, buf, _IOFBF, BUFSIZ).

 

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

 

Функции printf осуществляют вывод информации по формату.

int fprintf(FILE *stream, const char *format, ...);

fprintf преобразует и пишет вывод в поток stream под управлением format. Возвращаемое значение - число записанных символов или, в случае ошибки, отрицательное значение.

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

· Флаги (в любом порядке), модифицирующие спецификацию:

- - указывает на то, что преобразованный аргумент должен быть прижат к левому краю поля;
+ - предписывает печатать число всегда со знаком;
пробел - если первый символ - не знак, то числу должен предшествовать пробел;
- указывает, что числа должны дополняться слева нулями до всей ширины поля;
# - указывает на одну из следующих форм вывода: для o первой цифрой должен быть 0; для x или X ненулевому результату должны предшествовать 0x или 0X; для e, E, f, g и G вывод должен обязательно содержать десятичную точку; для g и G завершающие нули не отбрасываются.

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

· Точка, отделяющая указатель ширины поля от указателя точности.

· Число, задающее точность, которое специфицирует максимальное количество символов, печатаемых из строки, или количество цифр после десятичной точки в преобразованиях e, E или f, или количество значащих цифр для g или G - преобразования, или минимальное количество цифр при печати целого (до необходимой ширины поля число дополняется слева нулями).

· Модификаторы h, l (буква ell) или L. " h" указывает на то, что соответствующий аргумент должен печататься как short или unsigned short; " l" сообщает, что аргумент имеет тип long или unsigned long; " L" информирует, что аргумент принадлежит типу long double.

Ширина, или точность, или обе эти характеристики могут быть специфицированы с помощью *; в этом случае необходимое число " извлекается" из следующего аргумента, который должен иметь тип int (в случае двух звездочек используются два аргумента).

Символы-спецификаторы и разъяснение их смысла приведены в таблице B-1. Если за % нет правильного символа-спецификатора, результат не определен.

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

printf (...) полностью эквивалентна fprintf(stdout, ...).

int sprintf(char *s, const char *format, ...)

sprintf действует так же, как и printf, только вывод осуществляет в строку s, завершая ее символом '\0'. Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов, в число которых символ '\0' не входит.

int vprintf (const char *format, va_list arg)int vfprintf (FILE *stream, const char *format, va_list arg)int vsprintf (char *s, const char *format, va_list arg)

Функции vprintf, vfprintf и vsprintf эквивалентны соответствующим printf- функциям с той лишь разницей, что переменный список аргументов представлен параметром arg, инициализированным макросом va_start и, возможно, вызовами va_arg (см. в B7 описание < stdarg.h> ).

Таблица B-1. Преобразования printf

Символ Тип аргумента; вид печати
d, i int; знаковая десятичная запись
o unsigned int; беззнаковая восьмеричная запись (без 0 слева)
x, X unsigned int; беззнаковая шестнадцатеричная запись (без 0x или 0X слева), в качестве цифр от 10 до 15 используются abcdef для x и ABCDEF для X
u unsigned int; беззнаковое десятичное целое
c int; единичный символ после преобразования в unsigned char
s char *; символы строки печатаются, пока не встретится '\0' или не исчерпается количество символов, указанное точностью
f double; десятичная запись вида [-]mmm.ddd, где количество d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки
e, E double; десятичная запись вида [-]m.dddddde±xx или запись вида [-]m.ddddddE±xx, где количество d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки
g, G double; используется %e и %E, если порядок меньше -4 или больше или равен точности; в противном случае используется %f. Завершающие нули и точка в конце не печатаются
p void *; печатает в виде указателя (представление зависит от реализации
n int *; число символов, напечатанных к данному моменту данным вызовом printf, записывается в аргумент. Никакие другие аргументы не преобразуются
% никакие аргументы не преобразуются; печатается %

 

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

 

Функции scanf имеют дело с форматным преобразованием при вводе

int fscanf(FILE *stream, const char *format, ...);

fscanf читает данные из потока stream под управлением format и преобразованные величины присваивает по порядку аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.

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

· пробелы и табуляции, которые игнорируются;

· обычные символы (кроме % ), которые ожидаются в потоке ввода среди символов, отличных от символов-разделителей;

· спецификации преобразования, состоящие из %; необязательного знака *, подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, l или L, указывающих размер присваиваемого значения, и символа-спецификатора преобразования.

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

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

Символам-спецификаторам d, i, n, o, u и x может предшествовать h, если аргумент есть указатель на short (а не int) или l (буква ell), если аргумент есть указатель на long. Символам-спецификаторам e, f и g может предшествовать l, если аргумент - указатель на double (а не float), или L, если аргумент - указатель на long double.

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

scanf (...) делает то же, что и fscanf(stdin, ...).

int sscanf (const char *s, const char *format, ...);

sscanf (s, ...) делает то же, что и scanf(...), только ввод символов осуществляет из строки s.

Таблица B-2. Преобразования scanf

Символ Данные на вводе; тип аргумента
d десятичное целое; int *
i целое: int *. Целое может быть восьмеричным (с нулем слева) или шестнадцатеричным (с 0x или 0X слева)
o восьмеричное целое (с нулем слева или без него); int *
u беззнаковое десятичное целое; unsigned int *
x шестнадцатеричное целое (с 0x или 0X слева или без них): int *
c символы, char *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умолчанию это количество равно 1. Символ'\0' не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы прочесть следующий символ-разделитель, используйте %1s
s строка символов, отличных от символов-разделителей (записывается без кавычек); char *, указывающий на массив размера достаточного, чтобы вместить строку и добавляемый к ней символ '\0'
e, f, g число с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком
p значение указателя в виде, в котором printf (" %р" ) его напечатает; void *
n записывает в аргумент число символов, прочитанных к этому моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается
[...] выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках: char *. В конец строки добавляется '\0'. Спецификатор вида []...] включает ] в задаваемое множество символов
[^...] выбирает из ввода самую длинную непустую строку, состоящую из символов, не входящих в заданное в скобках множество. В конец добавляется '\0'. Спецификатор вида [^]...] включает ] в задаваемое множество символов
% обычный символ %; присваивание не делается

 


Поделиться:



Последнее изменение этой страницы: 2017-03-14; Просмотров: 362; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.048 с.)
Главная | Случайная страница | Обратная связь