§ 3. Ввод и вывод

§ 3.1 Форматированный ввод и вывод

Если вы разобрались с тем, как устроены различные типы, можно приступить к изучению консольного ввода и вывода.

int foo = 0;
...
foo = 42;

Выведем значение на экран. Для этого нужна функция printf(). Для простоты будем указывать результат работы функции прямо в комментарии.

printf("%d", foo); // 42

Она проще, чем пытается казаться. Список аргументов (часть в скобках) начинается со строки формата (как и любая другая строка, она ограничивается знаками "). Она может содержать много интересных вещей, но пока мы остановимся на спецификаторах типов. Спецификатор %d означает целое десятичное число (decimal). После строки формата следует название переменной. Вот на место %d и подставится её значение.

Создадим ещё одну переменную и выведем на экран их значения. Вот полный код программы.

#include <stdio.h>

int main()
{
    int foo = 42;
    int bar = 0;
    printf("%d %d", foo, bar); // 42 0
    return 0;
}

Кстати, обе переменные можно было объявить и инициализировать в одной строке.

int foo = 42, bar = 0;

Чтобы считать значение переменной с клавиатуры, понадобится функция scanf(). Она похожа на функциюprintf(). Давайте считаем какое-нибудь число с клавиатуры и выведем его же на экран.

#include <stdio.h>

int main()
{
    int foo = 0;
    scanf("%d", &foo); // Считываем число с клавиатуры в переменную foo.
    printf("%d", foo); // Выводим новое значение переменной foo на экран.
    return 0;
}

Знак & не опечатка. В большинстве случаев в функции scanf() он требуется, но не всегда (оставим этот вопрос на будущее). Остановитесь и выполните несколько заданий по этой теме.

Функции ввода и вывода поддерживают множество спецификаторов.

Спецификатор

Описание

%d

Целое десятичное

%i

Целое. Если при вводе добавить ноль (010), будет интерпретироваться как восьмеричное

%o

Восьмеричное

%X, %x

Шестнадцатеричное (%X будет использовать большие буквы, например, 2A7, а не 2a7)

%c

Символ

%s

Строка

%f

Число с плавающей запятой одинарной точности (при выводе оно неявно будет преобразовываться к типу double)

%lf

Число с плавающей запятой двойной точности

%E, %e

Экспоненциальная форма записи

%G, %g

Результат, как у %f или %e (выбирается тот, что короче)

%p

Указатель (хоть мы ещё и не рассматривали, что это такое)

int foo = 299792458;
printf("%d", foo);      // 299792458
printf("%16d", foo);    //        299792458  Выравнивание по правому краю.
printf("%-16d", foo);   // 299792458         Выравнивание по левому краю.
printf("%*d", 16, foo); //        299792458  Изменяемая ширина поля.
printf("%016d", foo);   // 0000000299792458  Заполнитель (не все типы, иногда игнорируется при указании точности).
printf("%+d", foo);     // +299792458        Всегда со знаком.
printf("% d", foo);     //  299792458        Минус или пробел в начале (приоритет ниже +).
printf("%#d", foo);     //  299792458        Вывод с указанием формата (например, %#x будет выводить
                                             в 16-ричном формате и дописывать 0x).
float bar = 4.1868f;
printf("%f", bar);           // 4.1868
printf("%.2f", bar);         // 4.19        Точность.
printf("%10.f", bar);        //     4.1868  Ширина поля.
printf("%10.2f", bar);       //       4.19  Точность и ширина поля.
printf("%*.*f", 10, 2, bar); //       4.19

Флаги (типа знака - или пробела) также доступны.

Как вывести знак процента, если он используется в спецификаторах? Как поставить кавычку, если она означает конец и начало строки?

Управляющий символ

Описание

%%

Знак процента

\t

Табуляция

\n

Перевод строки

\r

Возврат каретки

\\

Обратная косая черта

\'

Апострóф

\"

Кавычка

\0

Нулевой символ (признак конца строки)

Существуют экзотические управляющие символы, вроде \a (сигнал), их можно найти в справочниках. Можно ввести символ с произвольным кодом. Например, \55 — символ с кодом 55 (символ 7). Можно задавать коды символов в восьмеричной системе (\032) и шестнадцатеричной (\xFF).

В качестве упражнения предлагаю разобрать следующую строку формата.

int foo = 12, bar = 13, width = 12;
printf("%*d%%d%d\n", width, foo, bar);

Разделим её на части: %*d (целое с шириной поля 12), %% (знак процента), d (просто символ), %d (ещё одно целое), \n (перенос строки). При выводе получается           12%d13.

§ 3.1 Неформатированный вывод

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

puts("To be or not to be?");
putchar('@');
14 июня