Страница 1 из 2
sscanf - возможно ли спарсить
Добавлено: 20 ноя 2017, 08:35
Sunduk
Здравствуйте. Мне необходимо функцией sscanf спарсить текст который начинаетя с 8 и содержит символы a-l o-z и цифры от 5 до 9.
Как заставить sscanf проверять первый символ на наличие 8? Сейчас в буфер попадает Hello.
Код: Выделить всё
char text[] = "Hello 8AhRE9So6PlqHab World";
char result[260];
sscanf(text, " %15[A-La-LO-Zo-z5-9]", result);
Re: sscanf - возможно ли спарсить
Добавлено: 20 ноя 2017, 08:56
Romeo
Функция scanf никогда не использовалась для валидации. По факту, она её не делает, игнорируя всё, что ей не удалось прочитать. Если нужна валидация, делай её вручную.
Re: sscanf - возможно ли спарсить
Добавлено: 20 ноя 2017, 09:36
Sunduk
Romeo писал(а):Функция scanf никогда не использовалась для валидации. По факту, она её не делает, игнорируя всё, что ей не удалось прочитать. Если нужна валидация, делай её вручную.
Тем не менее. Вопрос актуальный.
Re: sscanf - возможно ли спарсить
Добавлено: 20 ноя 2017, 10:24
Absurd
Sunduk писал(а):Тем не менее. Вопрос актуальный.
Ответ - нет. Читай всю строку через fgets, затем валидируй при помощи pcre.
Re: sscanf - возможно ли спарсить
Добавлено: 20 ноя 2017, 15:53
Слива
Вообще-то там не Hello попадает в буфер, а просто H. А что это за каша такая в sscanf?
Код: Выделить всё
sscanf(text, " %15[A-La-LO-Zo-z5-9]", result);
Что-то я не нашел объяснение этой каше в документации. Разве так можно вообще писать?
Добавлено: 20 ноя 2017, 17:18
Romeo
Sunduk писал(а):Тем не менее. Вопрос актуальный.
- Хочу, чтобы кипящая вода была в твёрдом состоянии. Как это сделать?
- Это не возможно, парень.
- Тем не менее, вопрос актуальный.
Слива писал(а):А что это за каша такая в sscanf?
Ну, чисто теоретически, это не совсем каша для стандарта C99, согласно
документации.
Я, правда, сам никогда не использовал форматирование [characters], но точно знаю, что принцип работы "читай, что могу, остальное игнорируй" такой синтаксис всё равно не отменяет.
Re: sscanf - возможно ли спарсить
Добавлено: 21 ноя 2017, 15:36
WinMain
Лично я бы начал с того, что разделил бы исходную строку на отдельные слова и проверял бы поочерёдно каждое слово.
Но сама функция sscanf не умеет выделять отдельные слова из строки. Поэтому одной лишь функцией sscanf здесь вряд ли обойдёшься.
Re: sscanf - возможно ли спарсить
Добавлено: 23 ноя 2017, 15:30
Din666
man sscanf
Знак *, помещенный после % и перед спецификатором формата, считывает данные указанного типа, но подавляет их присваивание.
sscanf(text, "%*s %1[8]%14[A-La-LO-Zo-z5-9]", &result[0], &result[1])
Re: sscanf - возможно ли спарсить
Добавлено: 24 ноя 2017, 08:01
Слива
А что означает "%1[8]%14[A-La-LO-Zo-z5-9]" - можете это подробно объяснить? Объясните, пожалуйста, если сможете.

Re: sscanf - возможно ли спарсить
Добавлено: 24 ноя 2017, 10:19
Romeo
Din666 писал(а):man sscanf
Знак *, помещенный после % и перед спецификатором формата, считывает данные указанного типа, но подавляет их присваивание.
sscanf(text, "%*s %1[8]%14[A-La-LO-Zo-z5-9]", &result[0], &result[1])
Тем не менее, от неверных данных это всё равно не спасет.
Слива писал(а):А что означает "%1[8]%14[A-La-LO-Zo-z5-9]" - можете это подробно объяснить? Объясните, пожалуйста, если сможете.
Я же давал ссылку на мануал по scanf. Там подробно описан этот формат.