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

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

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

12.1. Вывод на дисплей через стандартный выходной поток

Функции 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 целого типа, используется только ее младший байт). При этом функции обрабатывают управляющие символы. Список управляющих символов приведен в таблице 13.1:

Символ   Код ASCII       Значение

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

Таблица 13.1 Управляющие символы.

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

// использование функци 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

#include <stdio.h>

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

Функция printf()

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

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

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

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

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

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

Различные спецификаторы формата перечислены в таблице 13.2:

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

Таблица 13.2 Спецификаторы формата функции printf().

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

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

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

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

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

Флаг           Значение
-              выравнивание по левой границе
+              перед числом помещается его знак
пробел (' ')   перед данными помещается пробел

Таблица 13.3 Флаги.

Префикс типа   Значение

F              дальний указатель
N              ближний указатель
h              короткое целое
l, L           длинное целое

Таблица 13.4 Префиксы типов.

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

Использование различных спецификаторов формата демонстрируется следующим примером:

// при использовании 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);
}

12.2. Вывод символов на консоль

Функция 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() возвращает число напечатанных ею символов или отрицательную величину в случае ошибки.