Здравствуйте, 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>
И что же тут делают эти апострофы в спецификаторах формата?