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

Последнее обновление: 18.05.2017

Для вывода на консоль в языке программирования Си зачастую применяется функция 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 
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850