Программирование на C и C++

Онлайн справочник программиста на C и C++

Использование множества сканирования

Функция scanf() поддерживает спецификатор формата общего назначения, называемый множеством сканирования. Множество сканирования определяет набор символов. Когда scanf() обрабатывает множество сканирования, она вводит символы до тех пор, пока символы являются частью множества сканирования. Читаемые символы сохраняются в символьном массиве, на который указывает соответствующий аргумент. Для определения множества сканирования необходимо поместить сканируемые символы в квадратные скобки. Открывающей квадратной скобке должен предшествовать знак процента. Например, следующее множество сканирования сообщает функции scanf() о необходимости чтения только символов X, Y и Z:

%[XYZ]

При использовании множества сканирования функция scanf() продолжает читать символы и помещает их в соответствующий массив символов, пока не встретится символ, не принадлежащий множеству сканирования. После возврата из scanf() массив будет содержать оканчивающуюся нулевым символом строку, состоящую из введенных символов. Чтобы понять, как это работает, рассмотрим программу:

#include <stdio.h>
int main(void)
{
int i;
char str[80], str2[80];
scanf ("%d%[abcdefg]%s", &i, str, str2);
printf ("%d %s %s", i, str, str2);
return 0;
}

Введем 123abcdtye, после чего нажмем ввод. Программа отобразит 123 abed tye. Поскольку "t" не является частью множества сканирования, scanf() останавливает чтение символов в str при обнаружении "t". Оставшиеся символы помещаются в str2.

Можно указать диапазоны множества сканирования, используя дефис. Например, следующая команда говорит функции scanf() о необходимости чтения символов от «А» до «Z»:

% [A-Z]

Использование дефиса для описания диапазонов не определено стандартом ANSI С. Тем не менее это общепринято.

Можно определить более одного диапазона, используя множество сканирования. Например, данная программа читает цифры, а затем буквы:

/* пример использования множества сканирования с заданием диапазонов */
#linclude <stdio.h>
int main (void)
{
char s1[80], s2[80];
printf("Enter numbers, then some letters");
scanf("%[0-9]%[a-zA-Z]", s1, s2);
printf("%s %s", s1, s2);
return 0;
}

Можно указать инвертированный набор в случае, если первый символ - это ^.  Если присутствует ^, то scanf() принимает все символы, не определенные во множестве сканирования. Следующая программа использует ^ для инверсии типа символов, читаемых множеством сканирования:

/* пример использования множества сканирования с заданием инвертированных диапазонов */
#include <stdio.h>
int main(void)
{
char s1[80], s2[80];
printf("Enter non-numbers, then some non-letters");
scanf ("%[^0-9]%[^a-zA-Z]", s1, s2) ;
printf ("%s %s", s1, s2);
return 0;
}

Следует помнить, что множество сканирования чувствительно к регистру. Следовательно, если необходимо просканировать как прописные, так и строчные буквы, следует указать их отдельно.