Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное
- Название:Язык программирования Си. Издание 3-е, исправленное
- Автор:
- Жанр:
- Издательство:Невский Диалект
- Год:2001
- Город:Санкт-Петербург
- ISBN:0-13-110362-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное краткое содержание
Книга широко известных авторов, разработчиков языка Си, переработанная и дополненная с учетом стандарта ANSI для языка Си, 2-е английское издание которой вышло в 1988 году, давно стала классикой для всех изучающих и/или использующих как Си, так и Си++. Русский перевод этой книги впервые был выпущен изд- вом "Финансы и статистика" в 1992 г. и с тех пор пользуется неизменным спросом читателей.
Для настоящего третьего русского издания перевод заново сверен с оригиналом, в него внесены некоторые поправки, учитывающие устоявшиеся за прошедшие годы изменения в терминологии, а так же учтены замечания, размещенные автором на странице http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html.
Для программистов, преподавателей и студентов.
Издание подготовлено при участии издательства "Финансы и статистика"
Язык программирования Си. Издание 3-е, исправленное - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
• Точка, отделяющая указатель ширины поля от указателя точности.
• Число, задающее точность, которое специфицирует максимальное количество символов, печатаемых из строки, или количество цифр после десятичной точки в преобразованиях 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 описание ).
Таблица 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 .
Читать дальшеИнтервал:
Закладка: