Консольный вывод. Функция printf


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

Формальное определение функции printf выглядит следующим образом:

1
printf(строка_форматирования, список_аргументов)
Первый параметр представляет строку, которая может содержать произвольный текст в двойных кавычках. Например:

1
2
3
4
5
6
#include <stdio.h>
int main(void)
{
printf("Hello world!");
return 0;
}
Кроме стандартного текста мы можем передавать в строку специальные группы символов, которые называются управляющими последовательностями. Наиболее распространенные из них:

\n: перевод на новую строку

\t: табуляция

\r: возврат каретки (курсора) в начало строки

\\: обратный слеш

\': одинарная кавычка

\": двойная кавычка

Например:

1
2
3
4
5
6
#include <stdio.h>
int main(void)
{
printf("The book \"The C Programming Language\"\nBrian Kernighan, Dennis Ritchie");
return 0;
}
Консольный вывод:

The book "The C Programming Language"
Brian Kernighan, Dennis Ritchie
Спецификации преобразования
Спецификации преобразования позволяют задать формат вывода различных типов данных. Формальное определение спецификаций преобразования выглядит следующим образом:

1
% флаги ширина_поля.точность модификатор спецификатор
Из этих компонентов обязательными являются только два % и спецификатор.

Какие спецификаторы мы можем использовать:

%c: для вывода отдельных символов (тип char)

%s: для вывода строк

%d: для вывода целых чисел со знаком (тип int)

%i: для вывода целых чисел со знаком (тип int)

%u: для вывода целых положительных чисел (тип unsigned)

%f: для вывода чисел с плавающей точкой (float, double)

%F: для вывода чисел с плавающей точкой в верхнем регистре (float, double)

%e: для вывода экспоненциального представления чисел с плавающей точкой (float, double)

%E: для вывода экспоненциального представления чисел с плавающей точкой в верхнем регистре (float, double)

%g: для вывода чисел используется более короткий из форматов %e или %f

%G: для вывода чисел используется более короткий из форматов %E или %F

%o: для вывода восьмеричных чисел без знака

%x: для вывода шестнадцатеричных чисел

%X: для вывода шестнадцатеричных чисел в верхнем регистре

%%: для вывода знака процента

Применим несколько спецификаторов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main(void)
{
float r = 71.8986;
printf("x = %f \n", r);
printf("x = %e \n", r);

char symbol = 'r';
printf("symbol = %c \n", symbol);

unsigned int number = 23;
printf("number = %u \n", number);

printf("%s \n", "Hello Word 2013");
return 0;
}
Значения для спецификаторов передаются через аргумент, который идет вторым параметром в функции printf.

Консольный вывод:

x = 71.898598
x = 7.189860e+001
symbol = r
number = 23
Hello Word 2013
Для вывода числовых значений с плавающей точкой мы можем использовать ширину поля и точность. Ширина поля представляет целое положительное число, которое определяет длину выводимого значения в символах. Точность - это также целое положительное число, которое определяет количество цифр в дробной части. Например:

1
2
float r = 71.8986;
printf("x = %4.2f \n", r); // 71.90
Здесь спецификация преобразования представляет строку "%4.2f", где "4" - ширина поля (для вывода числа будут использоваться 4 цифры), а "2" - точность (2 цифры в дробной части).

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

h: для вывода значений short int

l: для вывода значений long int

L: для вывода значений long double

1
2
short r = 7100;
printf("x = %hd", r);
Необязательно передавать по одному значению для вывода в функцию printf. Мы можем передавать множество значений:

1
printf("Name=%s \t Age=%d \t Weight=%3.2f", "Tom", 23, 63.3456);
Первый спецификатор в строке форматирования - "%s", и для него значение будет поставляться первым аргументом - строкой "Tom". Второй спецификатор - "%d", для него значение берется из второго аргумента - числа 23. И так далее.

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

+: если выводимое значение имеет знак (+ или -), то оно выводится. Без данного флага знак выводится только в случае отрицательного значения.

пробел: вставляет пробел на месте знака перед положительными числами

#: при использовании со спецификаторами "o", "x", "X" значение числа выводится с предшествующими символами 0, 0x или 0X. При использовании со спецификаторами "f", "g", "G" десятичная точка будет выводиться, даже если в числе нет дробной части

Пример использования флагов:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
printf("%d \n", 8);
printf("% d \n", 8);
printf("%+d \n", +8);
printf("%#o \n", 8);
printf("%#f \n", 8.);
return 0;
}
Консольный вывод:

8
8
+8
010
8.000000