Модификаторы спецификации преобразования для функции 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 )

для этих двух параметров преобразования.