Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Модификаторы функции scanf()

#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.

Комментариев нет:

Отправить комментарий