Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

Все приведенные примеры выводятся в поле шириной 10 символов. Обратите внимание на то, что отрицательная ширина поля означает выравнивание элемента по левому краю в пределах поля. Переменная ширина поля обозначается символом "звездочка" (

*
). В этом случае следующий аргумент применяется для задания ширины. Ведущий ноль указывает на вывод элемента с ведущими нулями. В соответствии со стандартом POSIX функция
printf
не обрезает поля; наоборот она расширяет поле, чтобы вместить в него аргумент. Например, если вы попытаетесь вывести строку большей длины, чем заданное поле, ширина поля будет увеличена (табл. 3.6).

Таблица 3.6

Формат Аргумент Вывод
%10s
"HelloTherePeeps"
|HelloTherePeeps|

Функции семейства

printf
возвращают целое число, равное количеству выведенных символов. В случае функции
sprintf
в него не включается завершающий нуль-символ. При наличии ошибок эти функции возвращают отрицательное значение и задают переменную
errno
.

scanf, fscanf и sscanf

Семейство функций

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

#include <stdio.h>

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

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

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

Очень важно, чтобы переменные, используемые для хранения значений, считываемых функциями

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

Строка

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

Рассмотрим простой пример:

int num;

scanf("Hello %d", &num);

Вызов функции

scanf
будет успешным, только если следующие пять символов в стандартном вводе —
Hello
. Затем, если следующие символы формируют распознаваемое десятичное число, оно будет считано и присвоено переменной
num
. Пробел в строке формата при вводе применяется для игнорирования во вводном файле всех пробельных символов (пробелы, табуляции, переводы страницы и переходы на новую строку) между спецификаторами преобразований. Это означает, что вызов,
scanf
будет успешным и поместит 1234 в переменную
num
в случае следующих двух вариантов ввода.

Hello 1234

Hellol234

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

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

Примечание

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

К другим спецификаторам преобразований относятся следующие:

%d
— считывание десятичного целого;

%o
,
%x
— считывание восьмеричного, шестнадцатеричного целого;

%f
,
%e
,
%g
— считывание числа с плавающей запятой;

%c
— считывание символа (пробельный символ не пропускается);

%s
— считывание строки;

%[]
— считывание множества символов (см. последующее обсуждение);

%%
— считывание знака
%
.

Как и в случае

printf
, у спецификаторов преобразований функции
scanf
есть ширина поля, ограничивающая объем ввода. Спецификатор размера (
h
для коротких или
l
для длинных целых) показывает, короче или длиннее стандартного получаемый аргумент. Таким образом,
%hd
обозначает число типа
short int
,
%ld
— число типа
long int
и
%lg
— число с плавающей точкой двойной точности.

  • Читать дальше
  • 1
  • ...
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: