#c #функции #scanf
интересует принципы работы модификаторов функции scanf() в C.
Знаю, что например при помощи записи такого вида scanf("%[<]", &symbol) могу задать
конкретный символ который нужно прочитать.
А так же с помощью такой записи scanf("%*c") могу отбросить символ и не выделять
под него переменную.
Корректна ли будет запись такого вида scanf(" %*[<] %lli %*[;] %lli %*[>]", &numMIN,
&numMAX)?
Нужно считать два значения, которые являются диапазоном интервала. Вводные данные
имеют вид <10;20>, < 45 ; 56 > или
<
23
;
34
>
пробелы, табуляция и т.д. значения не имеют, а вот корректность и последовательность
символов имеет.
Пробовал оформить это все вот так,
#include
int 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.
Комментариев нет:
Отправить комментарий