Читать «C++: базовый курс» онлайн - страница 339
Herbert Schildt
Элементы входного потока, считываемые функцией scanf(), должны быть разделены пробелами, символами табуляции или новой строки. Такие символы, как запятая, точка с запятой и тому подобное, не распознаются в качестве разделителей. Это означает, что инструкция:
scanf("%d%d", &r, &с);
Примет значения, введенные как 10 20, но наотрез откажется от "блюда", поданного в виде 10,20.
Подобно printf(), в функции scanf() спецификаторы формата по порядку сопоставляются с переменными, перечисленными в списке аргументов.
Символ стоящий "*" после знака "%" и перед кодом формата, прочитает данные заданного типа, но запретит их присваивание переменной. Следовательно, инструкция
scanf("%d%*c%d", &х, &у);
при вводе данных в виде 10/20 поместит значение 10 в переменную х, отбросит знак деления и присвоит значение 20 переменной у.
Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком "%" и кодом формата, которое ограничивает количество символов, считываемых для любого поля. Например, если вы хотите прочитать в переменную str не более 20 символов, используйте следующую инструкцию.
scanf ("%20s", str);
Если входной поток содержит более 20 символов, то при последующем выполнении операции ввода считывание начнется с того места, в котором "остановился" предыдущий вызов функции scanf(). Например, если (при использовании данного примера) вводится такая строка символов
ABCDEFGHIJKLMNOPQRSTUVWXYZ,
то в переменную str будут приняты только первые 20 символов (до буквы 'Т'), поскольку команда форматирования здесь содержит модификатор максимальной длины поля.
Это означает, что остальные символы, "UVWXYZ", не будут использованы вообще. В случае другого вызова функции scanf().
scanf("%s", str);
символы "UVWXYZ" поместились бы в переменной str. При обнаружении "пробельного" символа ввод данных для поля может завершиться до достижения максимальной длины поля. В этом случае функция scanf() переходит к считыванию следующего поля.
Несмотря на то что пробелы, символы табуляции и новой строки используются в качестве разделителей полей, при считывании одиночного символа они читаются подобно любому другому символу. Например, если входной поток состоит из символов х у, то инструкция
scanf ("%с%с%с", &а, &b, &с);
поместит символ х в переменную а, пробел — в переменную b и символ у — в переменную с.
Функцию scanf() можно также использовать в качестве набора сканируемых символов (scanset). В этом случае определяется набор символов, которые могут быть считаны функцией scanf() и присвоены соответствующему массиву символов. Функция scanf() продолжает считывать символы и помещать их в соответствующий символьный массив до тех пор, пока не встретится символ, отсутствующий в заданном наборе. После этого она переходит к следующему полю (если такое имеется).
Для определения такого набора необходимо заключить символы, подлежащие сканированию, в квадратные скобки. Открывающая квадратная скобка должна следовать сразу за знаком процента. Например, следующий набор сканируемых символов говорит о том, что необходимо прочитать только символы X, Y и Z.