Вы можете изменить базовую спецификацию преобразования, вставляя модификаторы между знаком % и символом, определяющим преобразования. В таблицах 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)
для этих двух параметров преобразования.