9. Стандартные функции вывода языка Си

В главе рассмотрены основные стандартные функции вывода текстовых данных на экран (через стандартный выходной поток и через консоль). К ним относятся функции putc, putchar, putch, puts, cputs, printf и cprintf.

Несмотря на то, что эти функции не входят в определение языка Си, по причинам совместимости их формат одинаков для всех трансляторов с языка Си.

Функции putchar и putc

Эти функции помещают один символ в текущую позицию выходного потока. Прототипы функций представлены ниже:


int putc( int ch, FILE *stream );

int putchar( int ch );

Функция putc отличается от putchar наличием второго аргумента, который определяет выходной поток, в который помещается символ. Она может использоваться и для записи символов в открытый файл и для записи в стандартные потоки ввода-вывода. В частности, если второй аргумент функции равен константе stdout, то она эквивалентна функции putchar и выводит символ в стандартный выходной поток. Этот поток может идти на экран монитора или в файл, если используется свойство переназначения потока. Фактически функция putchar является макроопределением:


#define putchar(_c)		putc((_c),stdout)

Первые параметры обеих функций совпадают по смыслу и задают ASCII-код выводимого символа (не смотря на то, что переменная ch целого типа, используется только ее младший байт). Функции обрабатывают управляющие символы. Список управляющих символов приведен в следующей таблице:

Символ Код ASCII Значение
\a 07h Звуковой сигнал
\b 08h Перемещение назад
\f 0Ch Переход к новой странице
\n 0Ah Новая строка
\r 0Dh Возврат каретки
\t 09h Горизонтальная табуляция
\v 0Bh Вертикальная табуляция
\' 27h Символ кавычки
\" 22h Двойная кавычка
\\ 5Ch Обратный слеш
\% 25h Знак процента

Функции возвращают ASCII-код выведенного на экран символа, а в случае ошибки возвращают константу EOF. Чтобы конкретизировать ошибку можно воспользоваться функцией ferror.

Программа PUTCHAR (листинг 9.1) демонстрирует использование функции putchar.

Листинг 9.1. Файл PUTCHAR.C


// Использование функции putchar
#include <stdio.h>

void main(void) {

	char *ptr,
		out_str[] = "\aputchar\nputc\a";

	for(ptr = out_str; *ptr; putchar(*(ptr++)) );
}

Включаемый файл STDIO.H содержит спецификации функций putchar и putc. Следовательно, этот файл необходимо включать во все программы, использующие данные функции.

Функция puts

Функция puts позволяет записать строку в стандартный выходной поток stdout. Строка должна оканчиваться нулем (символ '\0'). Этот символ не помещается в выходной поток. Вместо него записывается управляющий символ '\n', который переводит курсор в начало новой строки.

Функция имеет следующий прототип:


int puts( char *string );

Единственный параметр функции содержит указатель на отображаемую строку. При успешном выполнении функция возвращает ноль. Если же произошла ошибка, то возвращается ненулевая величина.

При использовании функции puts необходимо включить директивой include файл STDIO.H, содержащий спецификацию этой функции.

Программа PUTS (листинг 9.2) демонстрирует использование функции puts.

Листинг 9.2. Файл PUTS.C


#include <stdio.h>

void main(void) {
	puts("Работает функция puts!");
}

Функция printf

Наиболее универсальной стандартной функцией, обеспечивающей запись в выходной поток stdout, является функция printf. Она производит вывод на экран монитора строк, отдельных символов и чисел в различных форматах.

Приведем прототип функции printf:


 int printf( char *format [,argument]... );

Первый аргумент функции содержит указатель на управляющую строку, которая может состоять из:

Непосредственно выводимые символы и управляющие символы помещаются в выходной поток без изменения.

Если управляющая строка содержит спецификаторы формата, то каждому спецификатору должен соответствовать один аргумент, следующий за управляющей строкой. Аргументы представляют собой переменные или константы, которые преобразуются согласно соответствующих им спецификаторов формата и затем также помещаются в выходной поток.

Различные спецификаторы формата перечислены в следующей таблице:

Спецификатор формата Тип данных
%d, %i Целое десятичное число
%s Текстовая строка
%c Один символ
%e, %E Число с плавающей точкой в экспоненциальной форме
%f Число с плавающей точкой в десятичной записи
%u Целое десятичное число без знака
%o Целое восьмеричное число без знака
%x, %X Целое шестнадцатиричное число без знака
%g, %G Либо %e, либо %f в зависимости от того, в каком формате запись короче
%p Значение указателя
%n Количество символов

В более общем случае, в спецификаторе формата между символом '%' и символом, определяющим тип преобразования можно разместить флаги и префиксы типов:


% [флаг] [ширина] [.точность] [префикс типа] символ преобразования

Флаги приведены в таблице 13.3, а префиксы типов в таблице 13.4.

Параметр [ширина] задает минимальную ширину поля, используемую при печати строки или числа. Если это число или строка не помещаются в поле целиком, то ширина поля увеличивается.

Параметр [.точность] определяет для чисел количество отображаемых после запятой цифр, а для строк - максимальное число символов в строке.

Флаг Значение
- Выравнивание по левой границе
+ Перед числом помещается его знак
пробел (' ') Перед данными помещается пробел
Префикс типа Значение
F Дальний указатель
N Ближний указатель
h Короткое целое
l, L Длинное целое

Функция printf возвращает количество напечатанных ею символов или, в случае ошибки, отрицательную величину.

Использование различных спецификаторов формата функции printf демонстрируется программой PRINTF (листинг 9.3).

Листинг 9.3. Файл PRINTF.C


// При использовании функции printf необходим файл stdio.h
#include <stdio.h>

void main(void) {

	int  char_count;
	char ptr[] = "строка";

	printf("\n%23d  \n%e  \n%.3E  \n%f  \n%+g  \n%-23G \n\n",
		   1111,   0.01, 0.01,   0.01, 0.01,  0.0000001);

	printf("%s%n", ptr,  &char_count);

	printf("\n\nПредыдущая функция вывела %d символов.\n\n",
	       char_count);

	printf("Это %s, расположенная по адресу %Lp.\n\a",
		ptr, ptr);
}

Функция putch

Функция выполняет запись символа на консоль без буферизации. Прототип функции:


int putch( int ch );

Параметр функции ch содержит код ASCII выводимого символа. Заметим, что используется только младший байт параметра функции.

Функция putch возвращает код ASCII записанного символа, или, в случае возникновения ошибки, константу EOF.

При использовании функции putch необходимо включить в программу файл CONIO.H, который содержит ее спецификацию.

Функция cputs

Функция выполняет запись строки символов, оканчивающихся нулем, на консоль. В отличие от функции puts курсор не переводится на новую строку.

Приведем прототип функции cputs:


int cputs( char *string );

Единственный параметр функции содержит указатель на отображаемую строку. При успешном выполнении функция возвращает ноль. Если произошла ошибка, то возвращается ненулевая величина.

При использовании функции cputs необходимо включить директивой include файл CONIO.H, содержащий спецификацию этой функции.

Функция cprintf

Функция обеспечивает вывод на экран монитора строк, отдельных символов и чисел в различных форматах непосредственно на консоль. Для вывода отдельных символов используется функция putch.

Приведем прототип функции cprintf:


int cprintf( char *format [,argument]... );

Ее параметры соответствуют параметрам функции printf, описанной выше. Единственное отличие состоит в том, что она не преобразует символ перевода строки в пару символов - возврат каретки, перевод строки.

Функция cprintf возвращает количество напечатанных символов или отрицательную величину в случае ошибки.