Где может быть полезен форматный вывод

Где может быть полезен форматный вывод thumbnail

Форматный вывод числовых результатов на стандартное устройство вывода (stdout), которым по умолчанию является экран дисплея, осуществляется с помощью функции printf.

Общий вид записи оператора

printf(“список форматов”,cпиcoк имен переменных и выражений);

Например:

printf (“Результат: %d + %d = %d n”, a, b, c );

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

%dвывод целого числа

%fвывод вещественного числа

%eвывод вещественного числа в экспоненциальной форме

вывод одного символа

%sвывод символьной строки

nпереход в начало новой строки экрана

все остальные символы (кроме некоторых других специальных команд) просто выводятся на экран.

В форматной строке мы сказали компьютеру, какие данные (целые, вещественные или символьные) надо вывести на экран, но не сказали откуда (из каких ячеек памяти) их брать. Поэтому через запятую после форматов вывода надо поставить список чисел или имен переменных, значения которых надо вывести. В список вывода могут входить арифметические выражения, значения которых предварительно будут посчитаны, а потом выведены в соответствии с использованными форматными указателями. Выражения и имена переменных в списке вывода перечисляются через запятую. В качестве простейших выражений могут быть константы, переменные, символы, строки.

printf ( “Результат: %d + %d = %d n”, a, 5, a+5 );

Так же, как и для функции scanf, надо следить за совпадением типов форматов и типов переменных, а также количество форматов вывода должно быть равно количеству переменных в списке.

Пример1:

#include “stdafx.h”

int main(){ int i; float f; double d;………. printf(“%d %f %lf”, i+1, f, f*d);……….}

Пример 2:

Операторы

printf(“Выходные данные:n”);

printf(“K=%d y=%f”, 8+5, 7.0/10);

выводят на экран результаты в следующем виде:

Выходные данные:

К=13 у=0.700000

Управление выводом данных

При стандартной форме вывода вещественные числа отображаются на экране с шестью знаками после запятой. При выводе числа в экспоненциальном формате мантисса выводится в нормализованном виде, т.е. с одной значащей цифрой в целой части и шестью цифрами в дробной части. На порядок отводится пять позиций: первая позиция – под букву e, вторая позиция – под знак порядка, третья, четвертая и пятая позиции – под цифры порядка.

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

1. Ширина поля, определяющая число позиций на экране, отводимых для вывода всего числа, включая целую, дробную час­ти, знак и десятичную точку.

2. Точность представления вещественного числа, опреде­ляющая число позиций в дробной части.

Вещественное число с указанием форматов всегда выводится в десятичной форме. Для целого числа используется только фор­мат ширины поля.

В операторах вывода параметры форматов записываются после знака % и отделяются друг от друга точкой. На­пример, при записи оператора

printf(“K=%3d у=%5.2f”,8+3,7.0/10);

результаты отображаются на экране в следующем виде:

К= 11 у = 0.70

В приведенном примере в форматах %3d и %5.2f параметры 3 и 5 задают ширину поля, 2 – точность выводимого числа, т.е. значение выражения 7./10 будет выведено на экран с двумя значащими цифрами после запятой.

Источник

Как это сделано, например в С

Я думаю, все хорошо знают, как это сделано в С

Стандартный пример из Керниган, Ричи. Язык C

7.3. Форматный вывод – функция PRINTF

Две функции: PRINTF для вывода и SCANF для ввода (следующий раздел) позволяют преобразовывать численные величины в символьное представлEние и обратно. Они также позволяют генерировать и интерпретировать форматные строки. Мы уже всюду в предыдущих главах неформально использовали функцию PRINTF; здесь приводится более полное и точное описание. Функция PRINTF(CONTROL, ARG1, ARG2, …) преобразует, определяет формат и печатает свои аргументы в стандартный вывод под управлением строки CONTROL. Управляющая строка содержит два типа объектов: обычные символы, которые просто копируются в выходной поток, и спецификации преобразований, каждая из которых вызывает преобразование и печать очередного аргумента PRINTF.
Каждая спецификация преобразования начинается с символа % и заканчивается символом преобразования. Между % и символом преобразования могут находиться:
– знак минус, который указывает о выравнивании преобразован-
ного аргумента по левому краю его поля.
– Строка цифр, задающая минимальную ширину поля. Преобразо-
ванное число будет напечатано в поле по крайней мере этой
ширины, а если необходимо, то и в более широком. Если пре-
образованный аргумент имеет меньше символов, чем указанная
ширина поля, то он будет дополнен слева (или справа, если
было указано выравнивание по левому краю)заполняющими сим-
волами до этой ширины. Заполняющим символом обычно являет-
ся пробел, а если ширина поля указывается с лидирующим ну-
лем, то этим символом будет нуль (лидирующий нуль в данном
случае не означает восьмеричной ширины поля).
– Точка, которая отделяет ширину поля от следующей строки
цифр.
– Строка цифр (точность), которая указывает максимальное
число символов строки, которые должны быть напечатаны, или
число печатаемых справа от десятичной точки цифр для пере-
менных типа FLOAT или DOUBLE.
– Модификатор длины L, который указывает, что соответствую-
щий элемент данных имеет тип LONG, а не INT.
Ниже приводятся символы преобразования и их смысл:

Читайте также:  Чем полезна льняная мука и применение

D – аргумент преобразуется к десятичному виду.
O – Аргумент преобразуется в беззнаковую восьмеричную форму
(без лидирующего нуля).
X – Аргумент преобразуется в беззнаковую шестнадцатеричную
форму (без лидирующих 0X).
U – Аргумент преобразуется в беззнаковую десятичную форму.
C – Аргумент рассматривается как отдельный символ.
S – Аргумент является строкой: символы строки печатаются до
тех пор, пока не будет достигнут нулевой символ или не бу-
дет напечатано количество символов, указанное в специфика-
ции точности.
E – Аргумент, рассматриваемый как переменная типа FLOAT или
DOUBLE, преобразуется в десятичную форму в виде
[-]M.NNNNNNE[+-]XX, где длина строки из N определяется
указанной точностью. Точность по умолчанию равна 6.
F – Аргумент, рассматриваемый как переменная типа FLOAT или
DOUBLE, преобразуется в десятичную форму в виде
[-]MMM.NNNNN, где длина строки из N определяется указанной
точностью. Точность по умолчанию равна 6. отметим, что эта
точность не определяет количество печатаемых в формате F
значащих цифр.
G – Используется или формат %E или %F, какой короче; незначащие нули не печатаются.

Если идущий за % символ не является символом преобразования, то печатается сам этот символ; следовательно, символ % можно напечатать, указав %%. Большинство из форматных преобразований очевидно и было
проиллюстрировано в предыдущих главах. Единственным исключением является то, как точность взаимодействует со строками. Следующая таблица демонстрирует влияние задания различных спецификаций на печать “HELLO, WORLD” (12 символов). Мы поместили двоеточия вокруг каждого поля для того, чтобы вы могли видеть его протяженность.

:%10S: :HELLO, WORLD:
:%10-S: :HELLO, WORLD:
:%20S: : HELLO, WORLD:
:%-20S: :HELLO, WORLD :
:%20.10S: : HELLO, WOR:
:%-20.10S: :HELLO, WOR :
:%.10S: :HELLO, WOR:

Предостережение: PRINTF использует свой первый аргумент для определения числа последующих аргументов и их типов. Если количество аргументов окажется недостаточным или они будут иметь несоответственные типы, то возникнет путаница и вы получите бессмысленные результаты.

прошу прощения за длинную цитату.

Источник

Теги: Форматированный ввод, форматированный вывод, printf, scanf, fgets, getch, строка формата, спецификатор формата, флаги, управляющие символы.

Форматированный вывод

Сегодня мы рассмотрим две важные функции форматированного ввода и вывода. Устройство и работу этих функций полностью можно понять только после
изучения работы с указателями и функций с переменным числом параметров. Но пользоваться этими функциями необходимо уже сейчас, так что некоторые моменты
придётся пропустить.

Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число
выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ.
int printf (const char * format, …);

#include <stdio.h>
#include <conio.h>

void main() {
//функция не получает никаких аргументов, кроме строки
printf(“Hello world”);
getch();
}

Функция проходит по строке и заменяет первое вхождение % на первый аргумент, второе вхождение % на второй
аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.

Общий синтаксис спецификатора формата
%[флаги][ширина][.точность][длина]спецификатор
Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.

Таб. 1 Спецификатор типа.

СпецификаторЧто хотим вывестиПример
d или iЦелое со знаком в в десятичном виде392
uЦелое без знака в десятичном виде7235
oБеззнаковое в восьмеричном виде657
xБеззнаковое целое в шестнадцатеричном виде7fa
XБеззнаковое целое в шестнадцатеричном виде, верхний регистр7FA
f или FЧисло с плавающей точкой3.4563745
eЭкспоненциальная форма для числа с плавающей точкой3.1234e+3
EЭкспоненциальная форма для числа с плавающей точкой, верхний регистр3.1234E+3
gКратчайшее из представлений форматов f и e3.12
GКратчайшее из представлений форматов F и E3.12
aШестнадцатеричное представление числа с плавающей точкой-0xc.90fep-2
AШестнадцатеричное представление числа с плавающей точкой, верхний регистр-0xc.90FEP-2
cБукваa
sСтрока (нуль-терминированный массив букв)Hello World
pАдрес указателяb8000000
nНичего не печатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n
%Два идущих друг за другом процента выводят знак процента%
Читайте также:  Полезные статьи о правильном уходом за лицом

Примеры

#include <stdio.h>
#include <conio.h>

void main() {
int a = 0x77, b = -20;
char c = ‘F’;
float f = 12.2341524;
double d = 2e8;
char* string = “Hello, World!”;

printf(“%sn”, string);
printf(“a = %d, b = %dn”, a, b);
printf(“a = %u, b = %un”, a, b);
printf(“a = %x, b = %Xn”, a, b);
printf(“dec a = %d, oct a = %o, hex a = %xn”, a, a, a);
printf(“floating point f = %f, exp f = %en”, f, f);
printf(“double d = %f or %En”, d, d);
printf(“not all compiler support %an”, f);
printf(“character c = %c, as number c = %d”, c, c);
printf(“address of string is %p”, string);
getch();
}

Строка формата также может включать в себя следующие необязательные суб-спецификаторы: флаг, ширина, .точность и модификатор (именно в таком порядке).

Таб. 2 Флаги.

ФлагОписание
Выключка влево на заданное шириной значение
+Явно указывать знак у числа, даже для положительных чисел
(пробел)Если знак не будет выведен, то вставляет пробел перед выводимым числом
#Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X
Когда используется со спецификаторами a, A, e, E, f, F, g или G,
вставляет десятичную точку, даже если после неё нет десятичных знаков.
Вставляет нули, когда объявлен спецификатор ширины
Таб. 3 Ширина.

ШиринаОписание
(число)Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули)
*Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу
Таб. 4 Точность.

.ТочностьОписание
.числоДля спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче,
то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится.
Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6).
Для g и G – это число значащих разрядов, которые необходимо вывести.
Для s – выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого.
Если число не стоит, то по умолчанию точность равна 0
.*Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

Примеры

#include <stdio.h>
#include <conio.h>

void main() {
int a = 0x77, b = -20;
char c = ‘F’;
float f = 12.2341524;
double d = 2e2;
char* string = “Hello, World!”;

printf(“%.3fn”, f);
printf(“%.*fn”, 2, f);
printf(“%010.3fn”, d);
printf(“%*dn”, 6, a);
printf(“%+dn”, b);
printf(“%0.6dn”, a);
printf(“%.fn”, d);
printf(“%.4s”, string);
getch();
}

Суб-спецификатор длины изменяет длину типа. В случае, если длина не совпадает с типом, по возможности происходит преобразование до нужного типа.

Таб. 5 Длина.

спецификаторы
Длинаd, iu o x Xf F e E g G a Acspn
(none)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double

Примеры

#include <stdio.h>
#include <conio.h>

void main() {
long long x = 12300000000579099123;
short i = 10;
printf(“%llun”, x);
printf(“%dn”, i);
printf(“%hdn”, i);
getch();
}

Форматированный ввод

Рассмотрим форматированный ввод функцией scanf.
int scanf(const char*, …)
Функция принимает строку формата ввода (она похожа на строку формата printf) и адреса, по которым необходимо записать считанные данные. Возвращает
количество успешно проинициализированных аргументов.
Формат спецификатора ввода
%[*][ширина][длинна]спецификатор

Читайте также:  Чем полезен круг на шею для детей

Таб. 6 Спецификатор типа.

СпецификаторОписаниеВыбранные символы
i, uЦелыеПроизвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном.
dДесятичное целоеПроизвольное число цифр (0-9), возможно, начинающихся с + или -.
oвосьмеричное целоеПроизвольное число цифр (0-7), возможно, начинающихся с + или -.
xШестнадцатеричное целоеПроизвольное число цифр (0-F), возможно, начинающихся с + или – и префикса 0x или 0X.
f, e, gЧисло с плавающей точкойЧисло, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате.
a
cСимволЕсли ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце.
sСтрокаСчитывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный.
pАдрес указателяПоследовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p
[символы]Множество символовСчитывает только те символы, которые записаны в квадратных скобках, С99
[^символы]Множество символовСчитывает только те символы, которые не указаны в квадратных скобках, С99
nНичего не считываетСохраняет число уже считанных символов по указанному адресу

Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким флагом функции printf.

Примеры

#include <stdio.h>
#include <conio.h>

void main() {
int year, month, day;
char buffer[128];
int count;
//Требует форматированного ввода, например 2013:12:12
printf(“Enter data like x:x:x = “);
scanf(“%d:%d:%d”, &year, &month, &day);
printf(“year = %dnmonth = %d, day = %dn”, year, month, day);
//Считываем строку, не более 127 символов. При считывании в массив писать & не надо,
//так как массив подменяется указателем
printf(“Enter string = “);
scanf(“%127s”, buffer);
printf(“%s”, buffer);
getch();
}

Кроме функций scanf и printf есть ещё ряд функций, которые позволяют получать вводимые данные

int getch() [aka _getch(), getchar()] – возвращает введённый символ, при этом не выводит его на консоль.

#include <stdio.h>
#include <conio.h>

void main() {
char c = 0;
do {
c = getch();
printf(“%c”, c);
} while (c != ‘q’);
}

char * fgets ( char * str, int num, FILE * stream ) – функция позволяет считывать строку с пробельными символами.
Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в
том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main() {
char buffer[128];
//Считываем из стандартного потока ввода
fgets(buffer, 127, stdin);
printf(“%s”, buffer);
//Этим можно заменить ожидание ввода символа
scanf(“1”);
}

Это не полный набор различных функций символьного ввода и вывода.
Таких функций море, но очень многие из них небезопасны, поэтому перед использованием внимательно читайте документацию.

Непечатные символы

В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы
можно задавать в виде численных значений, либо в виде эскейп-последовательностей: символа, экранированного обратным слешем.

Таб. 7 Управляющие последовательности.

ПоследовательностьЧисловое значениеРезультат
a0x07Звуковой сигнал
b0x08Перевод каретки на одно значение назад
f0x0cНовая страница
n0x0aПеревод строки, новая строка
r0x0dВозврат каретки
t0x09Табуляция
v0x0bВертикальная табуляция
0x22Двойная кавычка
\0x5сОбратный слеш

#include <stdio.h>
#include <conio.h>

void main() {
char backspace = 0x08;
//Выводим с использованием символа переноса строки
printf(“HellonWorldn”);
//Выводим символ переноса строки через его значение
printf(“Hello%cWorldn”, 0x0a);
//”Выводим” сигнал
printf(“a”);
//Выводим сигнал, как символ
printf(“%c”, ‘a’);
//Выводим сигнал через шестнадцатеричное значение
printf(“%c”, 0x07);
printf(“This is sparta!!!bb%c”, backspace);
printf(” “);
getch();
}

Q&A

Всё ещё не понятно? – пиши вопросы на ящик email

Источник