Re: sscanf: неизвестное об известном
От: Андрей Тарасевич Беларусь  
Дата: 25.03.05 18:26
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Совсем недавно нашёл замечательную возможность функции sscanf, о которой не читал ни в одной книге, да и поиск по этому сайту говорит, что эта возможность выпала из поля зрения многих — очень многих.

VVV>Речь идёт о таком формате: %[search_set]

VVV>В квадратных скобках можно задавать [не]ожидающиеся во входном потоке символы и интервалы символов — похоже на синтаксис регулярных выражений.


Один недостаток такого спецификатора формата — он не может соответствовать пустой подстроке во входе. Что-то обязательно должно ему соответствовать. Иначе — ошибка и 'scanf' прекращает разбор.

VVV>Несколько примеров:


VVV>1. разбор строк типа key=value — периодически появляется здесь(на форуме) такой вопрос — теперь можно дать простой ответ .


VVV>
VVV>char *s="caption=RSDN forum";
VVV>char key[64];
VVV>char value[128];
VVV>sscanf(s, "%[^=]=%[]", key, value);
VVV>printf("key=%s value=%s\n", key, value);

VVV>


VVV>"%[^=]=%[]"

VVV>%[^=] — читать всё до символа = в переменную key
VVV>= — прочитать символ =
VVV>%[] — читать всё, включая пробелы в переменную value

Последнее неверно с точки зрения стандартной библиотеки. Спецификатор формата '[]' не поддерживает пустых наборов символов. Если за символом '[' сразу следует ']' (или за '[^' сразу следует ']'), то это ']' считается частью символьного набора, а не окончанием спецификатора. Например, "%[]ab] — это спецификатор, который соответствует символам ']', 'a' и 'b' во входе. А "%[]%[]" — это один спецификатор с символами ']', '%' и '[' внутри, а не два спецификатора, как может показаться с первого взгляда.

То, что ты написал — "%[]", это ни что иное как спецификатор с одним символом ']' внутри и без закрывающей скобки вообще, т.е. спецификатор сформирован некоррректно. Поведение не определено.

VVV>2. разбор comma-separated строк/файлов

VVV>Q38335 — к сожалению эта статья сейчас недоступна на сайте Микрософт- делаю копию из своего MSDN

VVV>HOWTO: sscanf() Example Using a Comma (,) as Delimiter


VVV>
VVV>...
VVV>   result = sscanf(tokenstring, "%[^','],%[^','],%[^','],%s", o, s, t, f);
VVV>...
VVV>


И что же тут делают эти апострофы в спецификаторах формата?
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.