Для ввода и вывода данных в консоли чаще всего используются функции 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.
Комментарии ()