Консольный вывод. Функция 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