Для вывода на консоль в языке программирования Си зачастую применяется функция printf(). Но если с выводом простой строки особых проблем не возникает, то при выводе данных других типов есть свои особенности.
Формальное определение функции printf выглядит следующим образом:
printf(строка_форматирования, список_аргументов)
Первый параметр представляет строку, которая может содержать произвольный текст в двойных кавычках. Например:
#include <stdio.h> int main(void) { printf("Hello world!"); return 0; }
Кроме стандартного текста мы можем передавать в строку специальные группы символов, которые называются управляющими последовательностями. Наиболее распространенные из них:
\n: перевод на новую строку
\t: табуляция
\r: возврат каретки (курсора) в начало строки
\\: обратный слеш
\': одинарная кавычка
\": двойная кавычка
Например:
#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
Спецификации преобразования позволяют задать формат вывода различных типов данных. Формальное определение спецификаций преобразования выглядит следующим образом:
% флаги ширина_поля.точность модификатор спецификатор
Из этих компонентов обязательными являются только два %
и спецификатор
.
Какие спецификаторы мы можем использовать:
%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: для вывода шестнадцатеричных чисел в верхнем регистре
%%: для вывода знака процента
Применим несколько спецификаторов:
#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
Для вывода числовых значений с плавающей точкой мы можем использовать ширину поля и точность. Ширина поля представляет целое положительное число, которое определяет длину выводимого значения в символах. Точность - это также целое положительное число, которое определяет количество цифр в дробной части. Например:
float r = 71.8986; printf("x = %4.2f \n", r); // 71.90
Здесь спецификация преобразования представляет строку "%4.2f", где "4" - ширина поля (для вывода числа будут использоваться 4 цифры), а "2" - точность (2 цифры в дробной части).
Модификаторы позволяют конкретизировать выводимое значение. Используются следующие модификаторы:
h: для вывода значений short int
l: для вывода значений long int и unsigned long int
ll: для вывода значений long long int и unsigned long long int
L: для вывода значений long double
short r = 7100; printf("x = %hd", r);
Необязательно передавать по одному значению для вывода в функцию printf. Мы можем передавать множество значений:
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" десятичная точка будет выводиться, даже если в числе нет дробной части
Пример использования флагов:
#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.); printf("%9s %d \n", "Tom", 38); printf("%-9s %d \n", "Tom", 38); return 0; }
Консольный вывод:
8 8 +8 010 8.000000 Tom 38 Tom 38