§ 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
Число с плавающей запятой двойной точности
%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
Перевод строки
\\
Обратная косая черта
\'
Апостроф
\&quot;
Кавычка
\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('@');
§ 2. Переменные и типы
Конспект по языку C
§ 4. Арифметика →
© MMXIMMXX
Светлая тема / тёмная тема