Где может быть полезен форматный вывод
Форматный вывод числовых результатов на стандартное устройство вывода (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();
}
Функция проходит по строке и заменяет первое вхождение % на первый аргумент, второе вхождение % на второй
аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.
Общий синтаксис спецификатора формата
%[флаги][ширина][.точность][длина]спецификатор
Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.
Спецификатор | Что хотим вывести | Пример |
---|---|---|
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 и e | 3.12 |
G | Кратчайшее из представлений форматов F и E | 3.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();
}
Строка формата также может включать в себя следующие необязательные суб-спецификаторы: флаг, ширина, .точность и модификатор (именно в таком порядке).
Флаг | Описание |
---|---|
– | Выключка влево на заданное шириной значение |
+ | Явно указывать знак у числа, даже для положительных чисел |
(пробел) | Если знак не будет выведен, то вставляет пробел перед выводимым числом |
# | Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков. |
Вставляет нули, когда объявлен спецификатор ширины |
Ширина | Описание |
---|---|
(число) | Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули) |
* | Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу |
.Точность | Описание |
---|---|
.число | Для спецификаторов целых (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();
}
Суб-спецификатор длины изменяет длину типа. В случае, если длина не совпадает с типом, по возможности происходит преобразование до нужного типа.
спецификаторы | |||||||
---|---|---|---|---|---|---|---|
Длина | d, i | u o x X | f F e E g G a A | c | s | p | n |
(none) | int | unsigned int | double | int | char* | void* | int* |
hh | signed char | unsigned char | signed char* | ||||
h | short int | unsigned short int | short int* | ||||
l | long int | unsigned long int | wint_t | wchar_t* | long int* | ||
ll | long long int | unsigned long long int | long long int* | ||||
j | intmax_t | uintmax_t | intmax_t* | ||||
z | size_t | size_t | size_t* | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t* | ||||
L | long 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) и адреса, по которым необходимо записать считанные данные. Возвращает
количество успешно проинициализированных аргументов.
Формат спецификатора ввода
%[*][ширина][длинна]спецификатор
Спецификатор | Описание | Выбранные символы |
---|---|---|
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”);
}
Это не полный набор различных функций символьного ввода и вывода.
Таких функций море, но очень многие из них небезопасны, поэтому перед использованием внимательно читайте документацию.
Непечатные символы
В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы
можно задавать в виде численных значений, либо в виде эскейп-последовательностей: символа, экранированного обратным слешем.
Последовательность | Числовое значение | Результат |
---|---|---|
a | 0x07 | Звуковой сигнал |
b | 0x08 | Перевод каретки на одно значение назад |
f | 0x0c | Новая страница |
n | 0x0a | Перевод строки, новая строка |
r | 0x0d | Возврат каретки |
t | 0x09 | Табуляция |
v | 0x0b | Вертикальная табуляция |
“ | 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
Всё ещё не понятно? – пиши вопросы на ящик