Теоретические положения
Простой ввод-вывод
Две функции printf() для вывода и scanf() для ввода позволяют преобразовать
численные величины в символьное представление и обратно. Они также позволяют
выполнить форматированный ввод-вывод.
Функция:
printf(format, arg1, arg2, ...)
печатает свои аргументы в соответствии с форматом. Строка format содержит
обычные символы, которые просто копируются в выходной поток, и спецификации
преобразований, каждая из которых вызывает преобразование и печать очередного
аргумента.
Каждая спецификация преобразования начинается с символа % и заканчивается
символом преобразования. Между % и символом преобразования могут находиться:
– знак минус, который говорит о выравнивании преобразованного аргумента по
левому краю его поля;
– строка цифр, задающая минимальную ширину поля. Преобразованное число
будет напечатано в поле по крайней мере этой ширины, а если необходимо, то и в
более широком. Если преобразованный аргумент имеет меньше символов, чем
указанная ширина поля, то он будет дополнен слева (или справа, если было указано
выравнивание по левому краю) заполняющими символами до этой ширины.
Заполняющим символом обычно является пробел, а если ширина поля указывается с
лидирующим нулем, то этим символом будет нуль (лидирующий нуль в данном
случае не означает восьмеричной ширины поля);
– точка, которая отделяет ширину поля от следующей строки цифр;
– строка цифр (точность), которая указывает максимальное число символов
строки, которые должны быть напечатаны, или число печатаемых справа от
десятичной точки цифр для переменных типа float или double;
– модификатор длины L, который указывает, что соответствующий элемент
данных имеет тип long, а не int.
Ниже приводятся символы преобразования и их смысл:
d или i – аргумент преобразуется к десятичному виду;
c – аргумент преобразуется в беззнаковую восьмеричную форму (без
лидирующего нуля);
X или x – аргумент преобразуется в беззнаковую шестнадцатеричную форму
(без лидирующих 0X);
u – аргумент преобразуется в беззнаковую десятичную форму;
c – аргумент рассматривается как отдельный символ;
2
s – аргумент является строкой: символы строки печатаются до тех пор, пока не
будет достигнут нулевой символ или не будет напечатано количество символов,
указанное в спецификации точности;
E или e – аргумент, рассматриваемый как переменная типа float или double,
преобразуется в десятичную форму в виде [-]M.NNNNNNE[+-]XX, где длина строки
из N определяется указанной точностью. Точность по умолчанию равна 6;
f – аргумент, рассматриваемый как переменная типа float или double,
преобразуется в десятичную форму в виде [-]MMM.NNNNNN, где длина строки из N
определяется указанной точностью. Точность по умолчанию равна 6;
G или g- используется или формат %E (e) или %f, какой короче. Незначащие
нули не печатаются.
Если идущий за % символ не является символом преобразования, то печатается
сам этот символ. Следовательно, символ % можно напечатать, указав %%.
Функция printf() использует строку формата для определения числа аргументов
и их типов. Если количество аргументов окажется недостаточным или они будут
иметь типы, не соответствующие формату, то могут быть получены бессмысленные
результаты.
Функция scanf() является аналогом printf() и выполняет при вводе форматные
преобразования в обратном направлении.
Функция
scanf(format, arg1, arg2, ...)
читает символы из стандартного ввода, интерпретирует их в соответствии с
форматом, указанном в format, и помещает результаты в аргументы. Каждый из
аргументов должен быть указателем.
Форматная строка может содержать:
– пробелы, табуляции или символы новой строки ("символы пустых
промежутков"), которые игнорируются;
– все символы таблицы ASCII, кроме %;
– спецификации преобразования, состоящие из символа %, необязательного
символа подавления присваивания *, необязательного числа, задающего
максимальную ширину поля и символа преобразования.
Спецификация преобразования управляет преобразованием следующего поля
ввода. Результат помещается в переменную, которая указывается соответствующим
аргументом.
Если с помощью символа * указано подавление присваивания, то это поле
ввода просто пропускается и никакого присваивания не производится. Поле ввода
определяется как строка символов, которые отличны от символов промежутков. Оно
3
продолжается до следующего символа промежутка, или пока не будет исчерпана
ширина поля, если она указана. Отсюда следует, что при поиске нужного поля,
функция scanf() будет пересекать границы строк, т.к. символ новой строки входит в
число промежутков.
Символ преобразования определяет интерпретацию поля ввода. Допускаются
следующие символы преобразования:
d или i – ожидается десятичное целое, соответствующий аргумент должен быть
указателем на целое;
o – ожидается восьмеричное целое (с лидирующим нулем или без него),
соответствующий аргумент должен быть указателем на целое;
x – ожидается шестнадцатеричное целое (с лидирующими 0X или без них),
соответствующий аргумент должен быть указателем на целое;
c – ожидается отдельный символ, соответствующий аргумент должен быть
указателем на символы. Обеспечивается чтение каждого следующего символа, даже
если это символ промежутка.
s – ожидается символьная строка, соответствующий аргумент должен быть
указателем на массив символов, который достаточно велик для принятия строки и
добавляемого в конце символа \0;
f – ожидается число с плавающей точкой, соответствующий аргумент должен
быть указателем на переменную типа float;
Е или e – ожидается число с плавающей точкой. Формат ввода переменной
типа float включает необязательный знак, строку цифр, возможно содержащую
десятичную точку, и необязательное поле экспоненты, состоящее из буквы E (e), за
которой следует целое, возможно имеющее знак.
Перед символами преобразования d (i), о и x может стоять модификатор длины
L, который означает, что в списке аргументов должен находиться указатель на
переменную типа long, а не типа int. Модификатор длины L также может стоять перед
символами преобразования E (e) или f, говоря о том, что в списке аргументов должен
находиться указатель на переменную типа double, а не типа float.
Выполнение функции scanf() заканчивается когда она исчерпает свою
форматную строку, или когда некоторый элемент ввода не совпадет со
спецификацией преобразования. В качестве своего значения scanf() возвращает число
правильно введенных элементов. Это число может быть использовано для
определения числа элементов ввода. При выходе на конец файла возвращается EOF.
Пример:
printf(\n %5.3f, 3.14159);
/* Вывод происходит с новой строки. Выводится число с плавающей точкой,
для которого отводится поле шириной 5, в котором 3 позиции отводится
4
под дробную часть. Результат округляется до третьего знака после
запятой.
*/
Файловый ввод-вывод
Закрытие файла
fi=fopen(“sam”,”r”);
fscanf(fi,”%d”,&age);
fclose(fi);
fi=fopen(“data”,”a”);
fprintf(fi,”Sam is %d.\n”,age);
fclose(fi);
}
f=fopen(“story”,”r”);
while(fgets(string,MAX,f)!=NULL)
fputs(string, stdout);
}
8
Например, оператор
fseek(f,-10,SEEK_END)
делает текущей позицию, находящуюся за десять символов до конца, в файле, на
который указывает первый аргумент.
Функция возвращает 0 при успешном выполнении и –1 при возникновении
ошибки (например, при попытке передвинуться за границы файла).
Задание
Варианты заданий
1) Убрать из текста лишние пробелы, т.е. там, где они встречаются больше
одного раза, оставить один пробел.
2) Подсчитать количество символов в заданном тексте.
3) Подсчитать количество слов и число предложений (предложения
оканчиваются точкой, слова разделяются запятыми).
4) Определить, какая буква чаще всего встречается в заданном тексте.
5) Если строка начинается с цифры, то перед ней поставить левую круглую
скобку, а в конец строки - правую круглую скобку.
6) Подсчитать число цифр в данном тексте и их сумму.
7) Перед каждым символом поставить порядковый номер в тексте.
8) Определить переменную "студент", содержащую следующие поля: имя,
фамилия, отчество студента, название института, номер группы. Данные считать из
текстового файла. Вывести данные о студентах, которые учатся в одном и том же
институте, и в одной группе.
9) Определить, входит ли заданное слово в текст. Если да, то сколько раз.
10) Удвоить в тексте каждую литеру.
11) Напечатать в алфавитном порядке все буквы, входящие в текст.
12) Подсчитать сумму чисел, записанных в тексте.
13) В тексте записаны слова через пробел. Вывести их в алфавитном порядке.
14) Напечатать самое длинное слово, найденное в тексте.
9
15) Во всех словах заменить первую букву на последнюю, а последнюю на
первую.
16) Удалить из текста все последующие вхождения первой буквы.
17) Оставить в слове только первые вхождения каждой буквы.
18) Заданное число, от 1 до 1999, напечатать римскими цифрами XLVI и т.д.
19) Определить, является ли текст правильной записью римскими цифрами
целого числа от 1 до 1999. Если да, то напечатать это число арабскими цифрами.
20) Удалить из текста каждое N-е вхождение в него заданного символа.
21) Удалить из текста каждое N-е вхождение в него заданного слова.
22) Задан текст. Вывести этот текст, подчеркивая (ставя в следующей строке
под этим символом минус) все входящие в него цифры.
23) Определить, равны ли два заданных файла.
24) Заменить заданное слово в тексте на другое слово.
25) Определить строку максимальной длины и вывести ее.
26) Подсчитать, сколько раз в тексте встречается заданное слово.
27) Выбросить из текста заданный знак, где бы он не встречался.
28) Удалить из текста каждое четное предложение.
29) Отформатировать текст следующим образом: каждое предложение должно
иметь свой порядковый номер; начинаться с красной строки.
30) Подсчитать, сколько раз в тексте встречается заданный знак.
31) Удалить из текста все предложения, в которых запятые встречаются более
2-х раз.
32) В тексте перед каждым предложением, в котором встречается заданное
слово, поставить восклицательный знак "!".
10