#c #функции #scanf
интересует принципы работы модификаторов функции scanf() в C. Знаю, что например при помощи записи такого вида scanf("%[<]", &symbol) могу задать конкретный символ который нужно прочитать. А так же с помощью такой записи scanf("%*c") могу отбросить символ и не выделять под него переменную. Корректна ли будет запись такого вида scanf(" %*[<] %lli %*[;] %lli %*[>]", &numMIN, &numMAX)? Нужно считать два значения, которые являются диапазоном интервала. Вводные данные имеют вид <10;20>, < 45 ; 56 > или < 23 ; 34 > пробелы, табуляция и т.д. значения не имеют, а вот корректность и последовательность символов имеет. Пробовал оформить это все вот так, #includeint main() { long long int numMIN, numMAX; char a; if (((scanf("%*[<]")) == 1) && ((scanf("%lli", &numMIN)) == 1)) return 0; else return 1; } но возвращает 1. Существует ли возможность оформить условие так, чтобы можно было пропустить конкретный символ, при этом не создавая под него отдельную переменную и иметь возможность проверить является ли вводимых символ корректным? Спасибо.
Ответы
Ответ 1
Знаю, что например при помощи записи такого вида scanf("%[<]", &symbol) могу задать конкретный символ который нужно прочитать. Формат %[] читает не символ, а строку из указанных символов и требует аргумента типа char *, указывающего на начало массива char. (Такой указатель практически никогда не приходится получать при помощи &. Применение & с форматами %s и %[] - обычно ошибка.) Корректна ли будет запись такого вида scanf(" %*[<] %lli %*[;] %lli %*[>]", &numMIN, &numMAX)? Корректна, но такая запись будет принимать и вход вида <<<<123 ;;;;;4>>. В этом заключался ваше замысел? Подозреваю, что нет. Если вы хотели просто потребовать наличия в входе по одному разделителю <, ; и > (возможно с пробелами), то вам не нужно было привлекать формат %[]. Это требование реализуется просто прямым указанием требуемого символа в строке формата scanf scanf(" < %lli ; %lli >", &numMIN, &numMAX) Никаких переменных при этом заводить не надо. if (((scanf("%*[<]")) == 1) ... Это заведомо неработоспособно. Подавленные при помощи * присваивания не включаются в финальный счетчик, возвращаемый scanf.
Комментариев нет:
Отправить комментарий