Ввод-вывод в Си
Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.
Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции
Вывод информации
Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.
Общая форма записи функции printf() :
СтрокаФорматов состоит из следующих элементов:
- управляющих символов;
- текста, представленного для непосредственного вывода;
- форматов, предназначенных для вывода значений переменных различных типов.
Объекты могут отсутствовать.
Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.
Основные управляющие символы:
- ‘\n’ — перевод строки;
- ‘\t’ — горизонтальная табуляция;
- ‘\v’ — вертикальная табуляция;
- ‘\b’ — возврат на символ;
- ‘\r’ — возврат на начало строки;
- ‘\a’ — звуковой сигнал.
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:
- %d — целое число типа int со знаком в десятичной системе счисления;
- %u — целое число типа unsigned int ;
- %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
- %o — целое число типа int со знаком в восьмеричной системе счисления;
- %hd — целое число типа short со знаком в десятичной системе счисления;
- %hu — целое число типа unsigned short ;
- %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
- %ld — целое число типа long int со знаком в десятичной системе счисления;
- %lu — целое число типа unsigned long int ;
- %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
- %f — вещественный формат (числа с плавающей точкой типа float );
- %lf — вещественный формат двойной точности (числа с плавающей точкой типа double );
- %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
- %c — символьный формат;
- %s — строковый формат.
Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си
Результат работы программы
Тот же самый код может быть представлен с использованием одного вызова printf :
Табличный вывод
При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:
Результат выполнения
В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.
Ввод информации
Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :
Строка форматов аналогична функции printf() .
Для формирования адреса переменной используется символ амперсанд ‘&’ :
адрес = &объект
Строка форматов и список аргументов для функции обязательны.
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include
#include // для перехода на русский язык
int main()
float y;
system( «chcp 1251» ); // переходим в консоли на русский язык
system( «cls» ); // очищаем окно консоли
printf( «Введите y: » ); // выводим сообщение
scanf( «%f» , &y); // вводим значения переменной y
printf( «Значение переменной y=%f» , y); // выводим значение переменной y
getchar(); getchar();
return 0;
>
Результат работы программы:
Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ) , которая появилась несколько позже, но содержит тот же самый список параметров.
Язык программирования си printf
Для вывода на консоль в языке программирования Си зачастую применяется функция printf() . Но если с выводом простой строки особых проблем не возникает, то при выводе данных других типов есть свои особенности.
Формальное определение функции printf выглядит следующим образом:
printf(строка_форматирования, список_аргументов)
Первый параметр представляет строку, которая может содержать произвольный текст в двойных кавычках. Например:
Кроме стандартного текста мы можем передавать в строку специальные группы символов, которые называются управляющими последовательностями. Наиболее распространенные из них:
- \n : перевод на новую строку
- \t : табуляция
- \r : возврат каретки (курсора) в начало строки
- \\ : обратный слеш
- \’ : одинарная кавычка
- \» : двойная кавычка
The book "The C Programming Language" Brian Kernighan, Dennis Ritchie
Спецификации преобразования
Спецификации преобразования позволяют задать формат вывода различных типов данных. Формальное определение спецификаций преобразования выглядит следующим образом:
% флаги ширина_поля.точность модификатор спецификатор
Из этих компонентов обязательными являются только два % и спецификатор .
Какие спецификаторы мы можем использовать:
- %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 : для вывода шестнадцатеричных чисел в верхнем регистре
- %% : для вывода знака процента
Применим несколько спецификаторов:
Значения для спецификаторов передаются через аргумент, который идет вторым параметром в функции printf.
x = 71.898598 x = 7.189860e+001 symbol = r number = 23 Hello Word 2013
Для вывода числовых значений с плавающей точкой мы можем использовать ширину поля и точность. Ширина поля представляет целое положительное число, которое определяет длину выводимого значения в символах. Точность — это также целое положительное число, которое определяет количество цифр в дробной части. Например:
float r = 71.8986; printf("x = %4.2f \n", r); // 71.90
Здесь спецификация преобразования представляет строку «%4.2f», где «4» — ширина поля (для вывода числа будут использоваться 4 цифры), а «2» — точность (2 цифры в дробной части).
Модификаторы позволяют конкретизировать выводимое значение. Используются следующие модификаторы:
- h : для вывода значений short int
- l : для вывода значений long int и unsigned long int
- ll : для вывода значений long long int и unsigned long long int
- L : для вывода значений long double
short r = 7100; printf("x = %hd", r);
Необязательно передавать по одному значению для вывода в функцию printf. Мы можем передавать множество значений:
printf("Name=%s \t Age=%d \t Weight=%3.2f", "Tom", 23, 63.3456);
Первый спецификатор в строке форматирования — «%s», и для него значение будет поставляться первым аргументом — строкой «Tom». Второй спецификатор — «%d», для него значение берется из второго аргумента — числа 23. И так далее.
Дополнительно можно использовать флаги, которые дополнительно позволяют управлять форматированием вывода:
- — : указывает, что выравнивание будет идти от левого края (по умолчанию используется выравнивае справа).
- + : если выводимое значение имеет знак (+ или -), то оно выводится. Без данного флага знак выводится только в случае отрицательного значения.
- пробел : вставляет пробел на месте знака перед положительными числами
- # : при использовании со спецификаторами «o», «x», «X» значение числа выводится с предшествующими символами 0, 0x или 0X. При использовании со спецификаторами «f», «g», «G» десятичная точка будет выводиться, даже если в числе нет дробной части
Пример использования флагов:
8 8 +8 010 8.000000 Tom 38 Tom 38