Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Вывод данных в языке C
Язык C++ поддерживает также операции вывода из языка C, объявленные в файле stdio.h
. В языке C++ вместо этого файла можно подключать файл cstdio
:
#include <cstdio>
Для вывода одиночного символа применяется функция putchar()
. Прототип функции:
#include <cstdio> /* или #include <stdio.h> */
int putchar(int ch);
Пример вывода символа:
std::putchar('w'); // w
std::putchar(119); // w
Вывести строку позволяет функция puts()
. Прототип функции:
#include <cstdio> /* или #include <stdio.h> */
int puts(const char *str);
Функция выводит строку str
и вставляет символ перевода строки. Пример:
std::puts("String1");
std::puts("String2");
Результат выполнения:
String1
String2
Для форматированного вывода используется функция printf()
. Можно также воспользоваться функцией _printf_l()
, которая позволяет дополнительно задать локаль. Прототипы функций:
#include <cstdio> /* или #include <stdio.h> */
int printf(const char *format, ...);
int _printf_l(const char *format, _locale_t locale, ...);
В параметре format
указывается строка специального формата. Внутри этой строки можно указать обычные символы и спецификаторы формата, начинающиеся с символа %
. Вместо спецификаторов формата подставляются значения, указанные в качестве параметров. Количество спецификаторов должно совпадать с количеством переданных параметров. В качестве значения функция возвращает количество выведенных символов. Пример вывода строки и числа:
std::printf("String\n");
std::printf("Count %d\n", 10);
std::printf("%s %d\n", "Count", 10);
Результат выполнения:
String
Count 10
Count 10
В первом примере строка формата не содержит спецификаторов и выводится как есть. Во втором примере внутри строки формата используется спецификатор %d
, предназначенный для вывода целого числа. Вместо этого спецификатора подставляется число 10
, переданное во втором параметре. В третьем примере строка содержит сразу два спецификатора %s
и %d
. Спецификатор %s
, предназначен для вывода строки, а спецификатор %d
— для вывода целого числа. Вместо спецификатора %s
будет подставлена строка Count
, а вместо спецификатора %d
— число 10
. Обратите внимание на то, что тип данных переданных значений должен совпадать с типом спецификатора. Если в качестве значения для спецификатора %s
указать число, то это приведет в ошибке времени исполнения. На этапе компиляции будет выведено лишь предупреждающее сообщение:
warning: format '%s' expects argument of type 'char*', but argument 2
has type 'int' [-Wformat=]
Параметр locale
в функции _printf_l()
позволяет задать локаль. Настройки локали для разных стран отличаются. Например, в одной стране принято десятичный разделитель вещественных чисел выводить в виде точки, в другой — в виде запятой. В функции printf()
используются настройки локали по умолчанию. Пример:
// #include <clocale>
_locale_t locale = _create_locale(LC_NUMERIC, "dutch");
std::printf("%.2f\n", 2.5); // 2.50
_printf_l("%.2f\n", locale, 2.5); // 2,50
std::setlocale(LC_NUMERIC, "dutch");
std::printf("%.2f\n", 2.5); // 2,50
_free_locale(locale);
Спецификаторы имеют следующий синтаксис:
%[<Флаги>][<Ширина>][.<Точность>][<Размер>]<Тип>
В параметре <Тип>
могут быть указаны следующие символы:
c
— символ:
std::printf("%c", 'w'); // w
std::printf("%c", 119); // w
s
— строка:
std::printf("%s", "String"); // String
d
илиi
— десятичное целое число со знаком:
std::printf("%d %i", 10, 30); // 10 30
std::printf("%d %i", -10, -30); // -10 -30
u
— десятичное целое число без знака:
std::printf("%u", 10); // 10
o
— восьмеричное число без знака:
std::printf("%o %o", 10, 077); // 12 77
std::printf("%#o %#o", 10, 077); // 012 077
x
— шестнадцатеричное число без знака в нижнем регистре:
std::printf("%x %x", 10, 0xff); // a ff
std::printf("%#x %#x", 10, 0xff); // 0xa 0xff
X
— шестнадцатеричное число без знака в верхнем регистре:
std::printf("%X %X", 10, 0xff); // A FF
std::printf("%#X %#X", 10, 0xff); // 0XA 0XFF
f
— вещественное число в десятичном представлении:
std::printf("%f %f", 18.65781452, 12.5); // 18.657815 12.500000
std::printf("%f", -18.65781452); // -18.657815
std::printf("%#.0f %.0f", 100.0, 100.0); // 100. 100
e
— вещественное число в экспоненциальной форме (букваe
в нижнем регистре):
std::printf("%e", 18657.81452); // 1.865781e+04
std::printf("%e", 0.000081452); // 8.145200e-05
E
— вещественное число в экспоненциальной форме (букваe
в верхнем регистре):
std::printf("%E", 18657.81452); // 1.865781E+04
g
— эквивалентноf
илиe
(выбирается более короткая запись числа):
std::printf("%g %g %g", 0.086578, 0.000086578, 1.865E-005);
// 0.086578 8.6578e-05 1.865e-05
G
— эквивалентноf
илиE
(выбирается более короткая запись числа):
std::printf("%G %G %G", 0.086578, 0.000086578, 1.865E-005);
// 0.086578 8.6578E-05 1.865E-05
p
— вывод адреса переменной:
int x = 10;
std::printf("%p", &x);
// Значение в проекте Test32: 0028fedc
// Значение в проекте Test64: 000000000023fe4c
%
— символ процента (%
):
std::printf("10%%"); // 10%
Параметр <Ширина>
задает минимальную ширину поля. Если строка меньше ширины поля, то она дополняется пробелами. Если строка не помещается в указанную ширину, то значение игнорируется и строка выводится полностью:
std::printf("'%3s'", "string"); // 'string'
std::printf("'%10s'", "string"); // ' string'
Задать минимальную ширину можно не только для строк, но и для других типов:
std::printf("'%10d'", 25); // ' 25'
std::printf("'%10f'", 12.5); // ' 12.500000'
Параметр <Точность>
задает количество знаков после точки для вещественных чисел. Перед этим параметром обязательно должна стоять точка. Пример:
std::printf("'%10.5f'", 3.14159265359); // ' 3.14159'
std::printf("'%.3f'", 3.14159265359); // '3.142'
Если параметр <Точность>
используется применительно к целому числу, то он задает минимальное количество цифр. Если число содержит меньшее количество цифр, то вначале числа добавляются нули. Пример:
std::printf("'%7d'", 100); // ' 100'
std::printf("'%.7d'", 100); // '0000100'
std::printf("'%.7d'", 123456789); // '123456789'
Если параметр <Точность>
используется применительно к строке, то он задает максимальное количество символов. Символы, которые не помещаются, будут отброшены. Пример:
std::printf("'%5.7s'", "Hello, world!"); // 'Hello, '
std::printf("'%15.20s'", "Hello, world!"); // ' Hello, world!'
Вместо минимальной ширины и точности можно указать символ *
. В этом случае значения передаются через параметры функции printf()
в порядке указания символов в строке формата. Примеры:
std::printf("'%*.*f'", 10, 5, 3.14159265359); // ' 3.14159'
std::printf("'%.*f'", 3, 3.14159265359); // '3.142'
std::printf("'%*s'", 10, "string"); // ' string'
В первом примере вместо первого символа *
подставляется число 10
, указанное во втором параметре, а вместо второго символа *
подставляется число 5
, указанное в третьем параметре. Во втором примере вместо символа *
подставляется число 3
, которое задает количество цифр после точки. В третьем примере символ *
заменяется числом 10
, которое задает минимальную ширину поля.
В параметре <Флаги>
могут быть указаны следующие символы:
#
— для восьмеричных значений добавляет в начало символ0
, для шестнадцатеричных значений добавляет комбинацию символов0x
(если используется типx
) или0X
(если используется типX
), для вещественных чисел указывает всегда выводить дробную точку, даже если задано значение0
в параметре<Точность>
:
std::printf("%#o %#o", 10, 077); // 012 077
std::printf("%#x %#x", 10, 0xff); // 0xa 0xff
std::printf("%#X %#X", 10, 0xff); // 0XA 0XFF
std::printf("%#.0f %.0f", 100.0, 100.0); // 100. 100
0
— задает наличие ведущих нулей для числового значения:
std::printf("'%7d'", 100); // ' 100'
std::printf("'%07d'", 100); // '0000100'
-
— задает выравнивание по левой границе области. По умолчанию используется выравнивание по правой границе. Пример:
std::printf("'%5d' '%-5d'", 3, 3); // ' 3' '3 '
пробел
— вставляет пробел перед положительным числом. Перед отрицательным числом будет стоять минус. Пример:
std::printf("'% d' '% d'", -3, 3); // '-3' ' 3'
+
— задает обязательный вывод знака, как для отрицательных, так и для положительных чисел. Пример:
std::printf("'%+d' '%+d'", -3, 3); // '-3' '+3'
В параметре <Размер>
могут быть указаны следующие буквы:
h
— для вывода значения переменной, имеющей типshort int
. Пример:
short int x = 32767;
std::printf("%hd", x); // 32767
unsigned short int y = 65535;
std::printf("%hu", y); // 65535
При передаче в функцию значение типа short
автоматически расширяется до типа int
, поэтому букву h
можно вообще не указывать:
short x = 32767;
std::printf("%d", x); // 32767
unsigned short y = 65535;
std::printf("%u", y); // 65535
l
(буква «эль») — для вывода значения переменной, имеющей типlong int
. Пример:
long int x = 2147483647L;
std::printf("%ld", x); // 2147483647
Модификатор l
можно использовать совместно с типами c
и s
, для вывода двухбайтового символа и строки, состоящей из двухбайтовых символов, соответственно. Пример:
wchar_t str[] = L"string";
std::printf("%ls", str); // string
ll
— для вывода значения переменной, имеющей типlong long
. Пример:
long long x = 9223372036854775807LL;
std::printf("%lld\n", x); // 9223372036854775807
L
— для вывода значения переменной, имеющей типlong double
. Пример:
long double x = 8e+245;
std::printf("%Le", x); // 8.000000e+245
Если выводить несколько значений подряд с помощью функции printf()
, то они все отобразятся на одной строке:
std::printf("string1");
std::printf("string2");
// string1string2
Чтобы значения выводились на отдельных строках нужно воспользоваться комбинацией символов \n
, обозначающей перевод строки:
std::printf("string1\n");
std::printf("string2");
/*
string1
string2 */
Следует учитывать, что функции putchar()
, puts()
и printf()
применяются в языке C. Хотя их можно использовать и в языке C++, тем не менее для вывода данных стоит отдать предпочтение объекту cout
. Описание функций putchar()
, puts()
и printf()
приведено в этой книге лишь для того, чтобы вы могли разобраться в чужом коде.
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов