Модификаторы спецификации преобразования для функции printf()
Вы можете изменить базовую спецификацию преобразования, вставляя модификаторы между знаком % и символом, определяющим преобразования. В таблицах 4.4 и 4.5 приводятся списки символов, которые можно размещать в этих местах. Если вы используете более одного модификатора, они должны располагаться в том же порядке, в каком они представлены в табл. 4.4. Не все комбинации допустимы. Таблицы отражают стандарт С99.
Использование функции scanf()
Функция scanf() преобразует строковый ввод в различные формы, например, целые числа, числа с плавающей запятой, символы и строки С. Эта операция обратная по действию функции printf(), которая преобразует целые числа, числа с плавающей запятой, сим волы и строки С в текст, который затем отображается на экране.
Подобно функции printf(), scanf() использует управляющую строку, сопровождаемую списком параметров. Управляющая с трока указывает, к каким типам данных должен быть преобразован вводимый поток символов . Главное различие между ними заключается в списке параметров. Функция printf() использует имена переменных, константы и выражения, а функция scanf() - указатели на переменные.
• Если вы используете функцию scanf() для чтения значения одного из базовых типов, перед именем такой переменной ставьте знак &.
· Если вы используете функцию scanf() для чтения строки в символьный массив, знак & не нужен.
Функция scanf() использует в основном тот же набор спецификаторов преобразования, что и функция printf(). Главное различие состоит в том, что функция printf() использует спецификаторы %f, %е, %Е, %g и %G для обоих типов float и double, тогда как функция scanf() применяет их только для типа с плавающей запятой float, требуя модификатор %l для типа double. В табл. 4.6 перечислены основные спецификаторы преобразования, как это описано в стандарте С99.
Таблица 4.6
Так же возможно использование модификаторов, точно так же как и в функции printf().
Функция scanf() не является наиболее часто используемой функцией ввода в С. Однако является универсальной (она может считывать все многообразие типов данных), тем не менее, в С доступны и другие функции ввода, например, getchar() и gets(), мы рассмотрим некоторые из этих функций позднее.
Резюме
Строка - это последовательность символов, рассматриваемая как единый блок. В языке С строки представлены последовательностями с им волов, завершающимися нулевым символом, АSСII-код которого равен 0. Строки могут сохраняться в символьных массивах. Массив представляет собой последовательность элементов, имеющих ОДИН и тот же тип.
Чтобы объявить массив с именем name, содержащий 30 элементов типа char, воспользуйтесь следующей конструкцией:
char name [30];
Позаботьте с ь о том, чтобы система выделила такое количество элементов, которое достаточно для того , чтобы вме стить с троку целиком , включая нулевой с имвол. Строковые константы создаются путем заключения строки в двойные кавычки:
" Это пример строки ".
Функцию strlen() можно ис пользовать для определения длины строки (без нулевого символа в конце ). Функция scanf() , будучи вызванной вместе со спецификатором % s , может применяться для чте ния строк, состоящих из одного слова.
Препроце с с ор языка С осуществляет поиск в исходном тексте программы директив для препроцес сора, которые начинаются с с им вола # , и дейс твует в с оответствии с этими дире ктивами до компиляции программы . Директива #include заставляет проце с с ор доб авлять с одержимое другого файла в ваш файл в то ме сто , где рас положе на эта дире ктив а . Директива #de fine позволяет определять явные константы, то есть задавать с имволичес кие представления констант. Заголовочные файлы l imi ts . h и float . h ис пользуют директиву #de fin e , чтобы определить набор констант, представляю щих различные свойства цело численных типов и чисел с плавающей запятой. Для с оздания с имволичес ких констант вы также можете ис пользовать модификатор con s t .
Функции p r i n t f ( ) и s can f ( ) обеспечивают универс альную подде ржку ввода и вывода . Каждая из них ис пользует управляю щую строку, содержащую вложе нны е с пецификаторы преобразования , которые указывают количество и типы элементов данных для чтения или вы вода на печать. Вы можете также ис пользовать с пецификаторы преобразования , чтобы управлять внешним видом выходных данных: шириной поля , количеством десятичных позиций и размещением в пределах поля . Воп росы для самоконтроля.
1 . Запустите программу из лис тинга 4.1 еще раз и введите имя и фамилию , когда программа предложит ввести имя . Что происходит в этом случа е ? Поче му? 2. Предположим, что кажды й из следую щих примеров я вляется частью законче нной программы. Что печатать будет каждая такая часть?
а. print f ( " Oн продал э ту к ар тину з а $ % 2 . 2 f . \ n " , 2 . 3 4 5 е 2 ) ;
б . print f ( " % c % c % c \ n " , ' Н ' , 1 0 5 , ' \ 4 1 ' ) ;
в. #de fi n e Q " Ег о Г амл е т был хорош и б е з н амека н а вул ь г арно сть . "
print f ( " % s \ ncoдepжи т % d симв олов . \ n " , Q , s tr l en ( Q ) ) ;
рrint f ( " Я в л я е тся ли % 2 . 2 е тем же , ч то и % 2 . 2 f ? \ n " ,
1 2 0 1 . 0 , 1 2 0 1 . 0 ) ;
3 . Какие изменения необходимо с делать в пункте 2 . в , чтобы строка Q была напе чатана
б е з кавычек?
4 . Попытайтес ь найти ошиб ку в следую щем код е :
de fine В ЬооЬоо
de fine Х 1 0
main ( i nt )
{
int age ;
char n ame ;
p r i n t f { " B в eдитe свое имя , " ) ;
s c a n f ( " l s " , n am e ) ;
p r i nt f ( " X opoшo , % С , а ско л ь ко в ам л е т ? \ n " , n ame ) ;
s c a n f ( " I E " , ag e ) ;
хр = age + Х ;
p r i n t f ( " Неужели , % s ! В ам должно быть , по меньшей мер е ,
l d л е т . \ n " , В , хр ) ;
r e r un О ;
5. Предположим, что программа начинается так:
#de fi n e ВООК " Война и мир "
int main ( vo i d )
{
flo at co s t = 1 2 . 9 9 ;
flo at p e r cent = 8 0 . 0 ;
Напишите оператор print f ( ) , который ис пользует ВООК, co s t и p er c ent , чтобы
напе чатать следую щ е е :
Э т о т э к з емпляр книги " В ойна и мир " с т о и т $ 1 2 . 9 9 .
Э то 8 0 % о т ц ены прайс-листа .
6 . Какие с пе цификаторы преобразования вы бы использовали, чтобы напе чатать:
а. Десятичное целое число с шириной поля , равной количес тву цифр этого
числа .
б . Ш е стнадцате ричное целое число в форме 8А в поле шириной 4 с им вола .
в. Число с плавающей запятой в форме 2 3 2 . 3 46 с шириной поля 1 0 с им волов .
r. Число с плавающей запятой в форме 2 . 3 3 е+ОО2 с шириной поля 1 2 символов .
д. Строку, выровненную п о ле вому краю в поле шириной 3 0 с имволов.
7 . Какие с пе цификаторы преобразования вы бы использовали, чтобы напе чатать
перечисленные ниже выражения?
а. Целое число типа unsigned long в поле шириной 15 с им волов.
б. Ш е стнадцате ричное целое число в форме Ох8а в поле шириной 4 с имвола .
в. Число с nпавающей запятой в форме 2 . 3 3Е+ О 2 , выровненное по левому краю
в поле шириной 12 с имволов.
r. Число с плавающей запятой в форме + 2 3 2 .3 46 в поле шириной 10 с имволов.
д. Пе рвые 8 с имволов с троки в поле шириной 8 с имволов.
8 . Какие с пе цификаторы преобразования вы бы ис пользовали, чтобы пе чатать
перечисленные ниже выражения?
а. Десятичное целое число, имеющее минимум 4 цифры в поле шириной 6
с имволов.
б . Восьме ричное целое число в поле, ширина которого будет задаваться в списке
параметров.
в. Символ в поле шириной 2 с имвола .
г. Число с плавающей запятой в форме + 3 . 1 3 в поле шириной, которая равна
количе ству с имволов в этом числе .
д. Пе рвые пять с имволов в строке, выровненной по ле вому краю поля шириной
7 с имволов.
9 . Для каждой из следую щих входных с трок напишите оператор s c an f ( ) , чтобы
прочитать их. О бъявите также пе ременные или масс ивы , ис пользуемые в операторе
.
а. 1 0 1
б . 2 2 . 3 2 и 8 . 3 4Е-09
в. linguini
г. catch 22
д. catch 22 (но пропус тить catch)
10. Что такое проб ельный с имвол?
1 1 . Предположим, что вы предпочитаете пользоваться круглыми скобками вместо
фигурных с кобок в с воих программах. Нас колько хорошо бы раб отали следующие
конструкции?
#de fi n e
#de fi n e ) }
Уп ражн ен и я по програм м ирован и ю
1 . Напишите программу, которая запрашивает имя и фамилию , а затем печатает
их в формате " фамилия, им.Я' .
2 . Напишите програм му, которая запрашивает имя и выполняет с ним следую щие
действия:
а. Пе чатает его заклю ченным в двойные кавычки.
б. Пе чатает е го в поле шириной 20 символов , при этом все поле заклю чается в
кавычки.
в. Пе чатает его с левого края поля шириной 20 символов , при этом вс е поле
заклю чается в кавычки.
г. Пе чатает его в поле шириной , на три с имвола превышающем длину имени.
3. Напишите программу, которая читает число с плавающей запятой и печатает
его с начала в де сятичной, а затем в экс поненциальной форме . Предус мотрите
вывод в следую щих формах ( количес тво цифр показателя с тепени в вашей системе
может быть другим) .
а. Вводом я вляется 2 1 . З или 2 . 1 е + О О 1 .
б . Вводом я вляется + 2 1 . 2 9 0 или 2 . 1 2 9Е+ 001 .
4. Напишите программу , которая запраш ивает рост в дю ймах и имя , после чего
отоб ражает получе нную информ ацию в с ледую ще й форм е :
Л арри , в аш р о с т с о с тавл я е т 6 . 2 0 8 фу тов
Ис пользуйте тип f l o a t , а также операцию деления / . Запро с ит е рост в с антиметрах
и выразите в метрах, если вам так удоб не е .
5 . Напишите программу, которая запрашивает имя пользователя и затем е го фамилию
. Сделайте так, чтобы она пе чатала введе нные имена в одной с троке и
количес тво с имволов в каждом слове в следую щей строке. Выровня йте каждое
количес тво с имволов по концу с оответствующего имени, как показано ниже:
Mel i s s a Honeyb e e
7 8
Зате м с делайте так, чтобы она печатала ту же с амую информацию , но с количеством
с имволов, выровненным по началу каждого слова :
Mel i s s a Honeyb e e
7 8
6 . Напишите программу , которая присваивает пере менной типа douЫ e значение
1 . 0 / 3 . 0 и пе ременной типа float значение 1 . 0 / 3 . 0 . В ыведите на экран каждый
ре зультат три раза - в первом с лучае с четы рьмя цифрами с права от десятичной
точки, во втором с лучае - с двенадцатью цифрами и в третьем случае -
с шес тнадцатью цифрами. Вклю чите также в программу заголовочный файл
float . h и выведите на экран значе ния F LT_DI G и D B L_D I G . С о вместимы ли выведенные
значе ния со значе нием 1 . 0 / О . 3 ?
7 . Напишите программу, которая прос ит пользователя ввести количество преодоле
нных миль и количе ство галлонов израсходованного бензина . Затем эта программа
должна расс читать и отобразить на экране количе ство миль, пройде нных
на одном галлоне горючего , с одним знаком после десятичной точки. Далее,
используя тот факт, что один галлон приблизительно равен 3 . 785 литра и
одна миля - 1 .609 километра , ваша программа должна пе ревести значение в
милях на галлон в литры на 1 0 0 километров (обычную е вропейскую меру измерения
потребления горю чего ) и выве сти ре зультат с одним знаком после десятичной
точки. (Об ратите внимание , что аме риканс кая схема измеряет затраты
горючего , не обходимого для преодоле ния заданного рас стояния , тогда как европе
йс кая схема измеряет пройденны й путь на единицу горю чего . ) Ис пользуйте
с им воличе ские константы ( определенные с помощью con s t или #de fi n e )
для этих двух параметров преобразования.