[cdev] sscanf
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Пн Дек 27 14:10:56 MSK 2010
Не совсем.
Вот возьмём определение sscanf из man-страницы:
int sscanf(const char *str, const char *format, ...);
В str у нас исходная строка, из которой мы что-то собрались извлекать. В
format у нас форматная строка, в которой описано КАК и ЧТО мы собираемся
извлекать, потому что об этом sscanf сам ничего не знает. Для него str
это просто байты, завершающиеся '\0'. Три точки на месте последнего
аргумента указывают на то что sscanf принимает переменное число
аргументов -- там мы передаём КУДА мы будем сохранять извлечённые
значения (указатели).
Форматная строка format представляет собой набор директив в которой
указано как нужно обрабатывать входные символы из str. Если при
обработке директив происходит ошибка, то дальше sscanf директивы не
обрабатывает и делает возврат.
- Каждый символ соответствует сам себе.
- Любой пробел соответствует любому количеству пробелов (или ни одному)
и может быть любым пробельным символом (см. isspace(3)).
- Спецификатор преобразования начинается с символа '%'. Результат
преобразования помещается в соответствующий аргумент по указателю.
Если при преобразовании было обнаружено несовпадение, то
преобразование терпит неудачу и sscanf делает возврат.
После символа '%' может следовать:
- опциональный символ '*', подавляющий запись в аргумент совпадения.
- десятичное число -- максимальная ширина поля, для чисел, и для строк
максимальное число символов, БЕЗ учёта завершающего '\0' который
записывает sscanf.
- опциональный модификатор типа, например 'l' для указания того что
при преобразовании целого '%d' значение по указателю аргумента
является long int а не int, при преобразовании числа с плавающей
точкой '%f' значение по указателю double а не float.
- спецификатор преобразования.
Спецификаторы преобразования есть например такие:
i - целое число, 10-тичное или 16-ичное.
d - целое число, 10-тичное.
f - число с плавающей точкой.
s - строка завершающаяся '\0'.
[ - строка включающая (или исключающая если после [ стоит ^) символы из
набора, например [^[a-z] означает "всё кроме символов в нижнем
регистре и скобки [".
% - символ '%'.
А вообще надо читать man-страницы. Эти функции одни из самых сложных для
понимания новичкам, это известная педагогическая трудность. Чтобы понять
как она работает, надо взять её исходный код. Стоит прочесть 9.1
Formatting Data в книге Practice of Programming, там есть один пример,
очень похожий, разобранный досконально.
--
Г.А.
Константин Никулов пишет:
> Ага. Т.е. получается, если мы хотим вычленить целые, надо между ними натыкать %*s, чтобы показать что там может что-то быть?
Подробная информация о списке рассылки cdev