Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
При выполнении эта программа отображает такие результаты.
| 123.230000 | | 123.230000 | | Привет| | Привет | Существуют два модификатора команд форматирования, которые позволяют функции printf() отображать короткие (short) и длинные (long) целые. Эти модификаторы могут применяться к спецификаторам типа d, i, о, и, х и X. Модификатор l уведомляет функцию printf() о длинном формате значения. Например, строка %ld означает, что должно быть выведено длинное целое. Модификатор h указывает на применение короткого формата. Следовательно, строка %hu означает, что выводимое целочисленное значение имеет тип short unsigned. Чтобы обозначить, что соответствующий аргумент указывает на длинное целое, к спецификатору n можно применить модификатор l. Для указания на короткое целое примените к спецификатору n модификатор h. Если вы используете современный компилятор, который поддерживает добавленные в 1995 году средства работы с символами широкого формата (двухбайтовыми символами), то можете задействовать модификатор l применительно к спецификатору с, чтобы уведомить об использовании двухбайтовых символов. Кроме того, модификатор l можно использовать с командой формата s для вывода строки двухбайтовых символов. Модификатор l можно также поставить перед командами форматирования вещественных чисел е, Е, f, F, g и G. В этом случае он уведомит о выводе значения типа long double. Функция scanf() Функция scanf() — это С-функция общего назначения ввода данных с консольного устройства. Она может считывать данные всех встроенных типов и автоматически преобразует числа в соответствующий внутренний формат. Ее поведение во многом обратно поведению функции printf(). Общий формат функции scanf() таков. int scanf (const char *fmt_string, ...); Управляющая строка, задаваемая параметром fmt_string, состоит из символов трех категорий: ■ спецификаторов формата; ■ " пробельных" символов (пробелы, символы табуляции и пустой строки); ■ символов, отличных от " пробельных". Функция scanf() возвращает количество введенных полей, а при возникновении ошибки — значение EOF (оно определено в заголовке stdio.h). Спецификаторы формата — им предшествует знак процента (%) — сообщают, какого типа данное будет считано следующим. Например, спецификатор %s прочитает строку, а %d — целое значение. Эти коды приведены в табл. А.2. Пробельные символы в строке форматирования заставляют функцию scanf() пропустить один или несколько пробельных символов во входном потоке. Под пробельным символом подразумевается пробел, символ табуляции или символ новой строки. По сути, один пробельный символ в управляющей строке заставит функцию scanf() считывать, но не сохранять любое количество (пусть даже нулевое) пробельных символов до первого непробельного. " Непробельный" символ в строке форматирования заставляет функцию scanf() прочитать и отбросить соответствующий символ. Например, при использовании строки форматирования %d, %d функция scanf() сначала прочитает целое значение, затем прочитает и отбросит запятую и наконец прочитает еще одно целое. Если заданный символ не обнаружится, работа функции scanf() будет завершена. Все переменные, используемые для приема значений с помощью функции scanf(), должны передаваться посредством их адресов. Это значит, что все аргументы должны быть указателями на переменные. (С не поддерживает ссылки или ссылочные параметры.) Передача указателей позволяет функции scanf() изменять содержимое любого аргумента. Например, если нужно считать целочисленное значение в переменную count, используйте следующий вызов функции scanf(). scanf(" %d", & count); Строки обычно считываются в символьные массивы, а имя массива (без индекса) является адресом первого элемента в этом массиве. Поэтому, чтобы считать строку в символьный массив address, используйте такой код. char address[80]; scanf(" %s", address); В этом случае параметр address уже является указателем, и поэтому его не нужно предварять оператором " & " . Элементы входного потока, считываемые функцией 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. %[XYZ] Соответствующая набору переменная должна быть указателем на массив символов. При возврате из функции scanf() этот массив будет содержать строку с завершающим нулем, состоящую из считанных символов. Например, следующая программа использует набор сканируемых символов для считывания цифр в массив s1. Если будет введен символ, отличный от цифры, массив s1 завершится нулевым символом, а остальные символы будут считываться в массив s2 до тех пор, пока не будет введен следующий " пробельный" символ. /* Простой пример использования набора сканируемых символов. */ #include < stdio.h> Int main() { char s1 [80], s2 [80]; printf(" Введите числа, а затем несколько букв: " ); scanf(" %[0123456789]%s", s1, s2); printf(" %s %s", s1, s2); return 0; } Многие компиляторы позволяют с помощью дефиса задать в наборе сканируемых символов диапазон. Например, при выполнении следующей инструкции функция scanf() будет принимать символы от А до Z. % [А-Z] При этом в наборе сканируемых символов можно задать даже несколько диапазонов. Например, эта программа считывает сначала цифры, а затем буквы. /* Пример использования в наборе сканируемых символов нескольких диапазонов. */ #include < stdio.h> Int main() { char s1[80], s2 [80]; printf(" Введите числа, а затем несколько букв: " ); scanf(" %[0-9]%[a-zA-Z]", s1, s2); printf (" %s %s", s1, s2); return 0; } Если первый символ в наборе сканируемых символов является знаком вставки (^), то получаем обратный эффект: вводимые данные будут считываться до первого символа из заданного набора символов, т.е. знак вставки заставляет функцию scanf() принимать любые символы, которые не определены в наборе. В следующей модификации предыдущей программы знак вставки используется для запрещения считывания символов, тип которых указан в наборе сканируемых символов: /* Пример использования набора сканируемых символов для запрещения считывания указанных в нем символов. */ #include < stdio.h> Int main() { char s1[80], s2[80]; printf(" Введите не цифры, а затем не буквы: " ); scanf(" %[^0-9]%[^a-zA-Z]", s1, s2); printf (" %s %s", s1, s2); return 0; } Популярное:
|
Последнее изменение этой страницы: 2016-03-17; Просмотров: 1134; Нарушение авторского права страницы