Ввод и вывод данных
Для ввода и вывода данных в консоли чаще всего используются функции scanf()
и printf()
. Обе функции определены в заголовочном файле stdio.h.
Вывод данных
Формальное определение функции printf:
int printf(const char *format, args)
Функция printf()
записывает в stdout аргументы args в том формате, который указан в строке format и возвращает количество записанных символов. Строка форматирования может содержать произвольный текст, управляющие последовательности символов и спецификаторы преобразования. Аргументы args могут отсутствовать. Пример:
#include <stdio.h>
int main(void)
{
int count = 0;
count = printf("Hello world!");
printf("\n %d", count);
return 0;
}
Список управляющих последовательностей
-
\n
перевод на новую строку -
\t
табуляция -
\r
возврат каретки (курсора) в начало строки -
**\\**
обратный слеш -
\'
одинарная кавычка -
\\"
двойная кавычка
Спецификаторы преобразования
-
%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)
{
int i = 10;
float f = 0.21;
printf("\n %d %4.2f", i, f);
return 0;
}
В данном примере для вывода числового значения с плавающей точкой используется ширина поля, определяющая количество выводимых символов и точность, задающая количество цифр после запятой.
Кроме того, для форматирования вывода можно использовать флаги:
-
-
указывает, что выравнивание будет идти от левого края (по умолчанию используется выравнивание справа). -
+
если выводимое значение имеет знак (+ или -), то оно выводится. Без данного флага знак выводится только в случае отрицательного значения. -
пробел
вставляет пробел на месте знака перед положительными числами -
#
при использовании со спецификаторами o, x, X значение числа выводится с предшествующими символами 0, 0x или 0X. При использовании со спецификаторами f, g, G десятичная точка будет выводиться, даже если в числе нет дробной части
Пример использования флагов:
#include <stdio.h>
int main(void)
{
printf("%d \n", 18);
printf("% d \n", 7);
printf("%+d \n", +5);
printf("%#o \n", 9);
printf("%#f \n", 2.);
printf("%9s %d \n", "Vasya", 28);
printf("%-9s %d \n", "Petya", 48);
return 0;
}
Ввод данных
Функция scanf()
является процедурой ввода, считывающей данные из потока stdin. Она может считывать данные всех базовых типов и автоматически конвертировать их в нужный внутренний формат.
int scanf(const char *format, args)
Для данной функции и строка форматирования format, определяющая тип вводимых данных, и аргументы args являются обязательными параметрами. Целое число, возвращаемое функцией, равное числу успешно считанных и записанных в переданные параметры значений.
Спецификаторы
-
%c
считывает один символ -
%d
считывает десятичное целое число -
%i
считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной) -
%u
считывает положительное целое число -
%e
считывает число с плавающей точкой в экспоненциальной форме -
%E
считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты -
%f
считывает число с плавающей точкой -
%F
считывает число с плавающей точкой -
%g
считывает число с плавающей точкой -
%G
считывает число с плавающей точкой -
%o
считывает восьмеричное число -
%x
считывает шестнадцатеричное число -
%X
считывает шестнадцатеричное число -
%s
считывает строку -
%%
считывает символ процента
Символ звездочки *
в спецификации преобразования позволяет пропустить при вводе водимые символы для указанного типа. Пример:
#include <stdio.h>
int main(void)
{
int i;
float f;
scanf("%d%*c%4f", &i, &f);
printf("%d%4.2f", i, f);
return 0;
}
Особенности считывания данных
Если указан спецификатор %c
, то функция считывает из потока ввода любой символ, в том числе и пробельный, а также символ конца строки. Но если в форматной строке перед %c
поставить пробел, то поскольку пробел в форматной строке обозначает последовательность пробельных символов любой длины, то в этом случае будет считан первый не пробельный символ, следующий за пробелами.
При считывании строки результат записывается в С-строку, которая представляет собой массив символов (или указатель типа char *
с выделенной памятью). Поскольку строка в языке C является адресом (указателем) в памяти, где хранится начало строки символов, то передавать в функцию scanf
нужно имя переменной без указания амперсанда:
char s[101];
scanf("%s", s);
Функция scanf
читает строку до первого пробельного символа, также она пропускает предшествующие пробелы, то есть она записывает следующее слово целиком составленное из не пробельных символов.
Иногда бывает полезно считать всю строку целиком вместе с пробелами до конца строки. Для этого используется функция gets(s)
.
Функция gets
считается опасной и не рекомендуется для использования, так как она не контролирует количество считанных символов и не учитывает длину передаваемой строки, что может привести к записи данных за пределами строки.
Вместо нее рекомендуется использование функции fgets(s, 101, stdin)
, у которой три параметра - строка для записи результата, размер строки и файловый поток, из которого читаются данные.
Не следует забывать, что в языке C в конец строки добавляется нулевой символ для обозначения конца строки. То есть если необходимо считать строку, в которой может быть 4 символа, то для нее нужно создать массив char[5]
, и функции fgets
нужно передавать число, не меньшее 5.
Самостоятельная работа
Задачи
Задача 1
Ввести три числа, найти их сумму.
- Данные на входе: Три целых числа через пробел
- Данные на выходе: Строка вида %d+%d+%d=%d
Пример №1:
- Данные на входе: 4 5 7
- Данные на выходе: 4+5+7=16
Пример №2:
- Данные на входе: 10 20 30
- Данные на выходе: 10+20+30=60
Задача 2
Ввести три числа, найти их сумму и произведение.
- Данные на входе: Три целых числа через пробел
- Данные на выходе: %d+%d+%d=%d
%d*%d*%d=%d
Пример №1:
- Данные на входе: 1 2 3
- Данные на выходе: 1+2+3=6
123=6
Пример №2:
- Данные на входе: 4 5 7
- Данные на выходе: 4+5+7=16
457=140
Задача 3
Ввести два числа и найти их разность.
- Данные на входе: Два целых числа через пробел
- Данные на выходе: Одно целое число
Пример №1:
- Данные на входе: 4 5
- Данные на выходе: -1
Пример №2:
- Данные на входе: 100 49
- Данные на выходе: 51
Задача 4
Ввести три числа, найти их среднее арифметическое.
- Данные на входе: Три целых целых числа через пробел
- Данные на выходе: Вещественное число в формате %.2f
Пример №1:
- Данные на входе: 4 5 7
- Данные на выходе: 5.33
Пример №2:
- Данные на входе: 1 2 3
- Данные на выходе: 2.00
Задача 5
На вход подается произвольное трехзначное число.
- Данные на входе: Трехзначное целое положительное число
- Данные на выходе: Одно целое число
Пример №1:
- Данные на входе: 435
- Данные на выходе: 60
Пример №2:
- Данные на входе: 102
- Данные на выходе: 0