Функции ввода и вывода

Язык С имеет большой набор различных функций для организации эффективного ввода и вывода разных типов данных. В этом подразделе рассмотрим только две функции – scanf и printf из файла stdio.h, предназначенные для организации форматированного вывода и ввода данных.

Функция scanf имеет следующий синтаксис:

< форматированный ввод > º scanf(" < шаблон > ", < список ввода >);

< список ввода > представляет собой последовательность разделенных запятыми указателей, значения которых являются адресами областей памяти соответствующих переменных. Функция предназначена для форматированного ввода с клавиатуры значений числового, символьного и строкового типов и типа указатель. В случае необходимости организации ввода значений переменных числового и символьного типа и типа указатель перед идентификатором переменной в < списке ввода > необходимо поместить знак операции адреса – &.

Например: float a,b

…..

тогда <список ввода> выглядит так &a,&b

*перед переменными строкового типа значек “&” не ставится,т.к они имеют смысл указатель

< Шаблон > задает допустимую последовательность символов логической строки окна результатов в режиме ввода с клавиатуры и может содержать символы двух типов:

1) вспомогательные символы, которые должны присутствовать в логической строке окна результатов в режиме ввода с клавиатуры и могут служить разделителями между значениями;

2) символы формата ввода, последовательность которых образует формат ввода.

Синтаксис формата ввода может иметь вид:

< формат ввода > º % [< длина >][< модификатор >]< символ преобразования >

< Длина > – число в виде строки цифр, задающее длину поля для ввода. Если длина отсутствует, то длина поля для ввода равна длине значения выражения.

< Символ преобразования >, в частности, может быть следующим:

d или i – значение преобразуется к целому десятичному;

о – значение преобразуется к целому восьмеричному;

х или X – значение преобразуется к целому шестнадцатеричному;

с – значение преобразуется к символу;

s – значение преобразуется к строке символов;

е или E – значение преобразуется к действительному в формате с плавающей точкой;

f – значение преобразуется к действительному;

u – значение преобразуется к целому беззнаковому;

р –значение преобразуется к указателю (адресу).

< Модификатор > используется для уточнения преобразования, а именно:

h – значение преобразуется к типу short (используется вместе с символами преобразования d, i, о, u, х, Х);

l – значение преобразуется к типу long (в случае символов преобразования d, i, о, u, х, X) или double (в случае символов преобразования е, Е, f);

L– значение преобразуется к типу long double (используется вместе с символами преобразований е, Е, f).

Семантика вызова этой стандартной функции в системе программирования Turbo–C++ следующая.

Компьютер переходит в режим ожидания ввода данных с клавиатуры. В этом режиме пользователю предоставляется возможность ввести с клавиатуры значения переменных, идентификаторы которых перечислены в < списке ввода >. Последовательность вводимых с клавиатуры символов для визуального контроля выводится на дисплей, начиная с текущего положения курсора окна результатов, и может редактироваться в диалоговом режиме обычным образом. В качестве корректных значений допускаются только константы соответствующего типа. Режим ожидания ввода данных с клавиатуры завершается нажатием клавиши “ENTER”, и компьютер переходит в режим интерпретации введенной пользователем с клавиатуры логической строки. Результат интерпретации этой логической строки зависит от соответствия вводимых данных < Символу преобразования > и < Модификатору >, наличия в ней соответствующих < Шаблону > вспомогательных символов, а для символьного и строкового типа еще и от < Длины >. Результат интерпретации не всегда удается предсказать, но известно, что для числового типа пробелы, соответствующие вспомогательные символы являются разделителями. Если < список ввода > содержит идентификаторы нескольких переменных то возможен ввод данных по частям. В случае неправильной интерпретации выполнение программы не завершается досрочно с выдачей сообщения об ошибке.

Если после интерпретации значений всех переменных < списка ввода >, в логической строке остались не интерпретированные символы, то они игнорируются. Если все символы логической строки интерпретированы, но не всем переменным < списка ввода > присвоены значения, то компьютер переходит в режим ожидания ввода данных с клавиатуры, считая, что осуществляется ввод данных по частям. Пользователь должен набрать еще одну логическую строку, и после нажатия клавиши “ENTER” компьютер попытается интерпретировать ее как последовательность значений соответствующих переменных, которым еще не присвоены значения, и так далее. Последовательность символов очередной вводимой логической строки для визуального контроля выводится на дисплей с начала новой строки экрана.

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

Например, при вычислении значения scanf("%c,%f",s, x) для присвоения s=’a’, x=1.23456e-10 логическая строка окна результатов в режиме ожидания ввода данных с клавиатуры может иметь вид:

а,1.23456e-10

Функция printf имеет следующий синтаксис:

< форматированный вывод > º printf(" < шаблон > ", < список вывода >);

< список вывода > представляет собой последовательность разделенных запятыми выражений, значения которых выводятся на экран дисплея в соответствии с форматами < шаблона >.

< Шаблон > содержит символы трех типов: вспомогательные символы, которые текстуально выводятся на экран дисплея, символы формата вывода и управляющие символьные константы. Синтаксис формата вывода может иметь вид:

< формат вывода > º % [ - ][< длина >][.< точность >][< модификатор >]< символ преобразования >

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

< Длина > – число в виде строки цифр, задающее минимальную длину поля для вывода. Если длина отсутствует, то длина поля для вывода равна длине значения выражения, с учетом < точности >. < Точность > – число в виде строки цифр, которое интерпретируется следующим образом:

· в случае использования < символа преобразования > в действительное значение < точность > задает число цифр после десятичной точки;

· в случае использования < символа преобразования > в строковое значение – максимальное число символов строки, начиная с ее начала, которое нужно вывести;

· в случае использования < символа преобразования > в целое значение – минимальное количество выводимых цифр. Если в значении меньше цифр, то оно выводится с необходимым числом ведущих нулей.

(Например, если символ преобразования «i»,а точность =5,а получилось число 123,то на экран будет выведено 00123)

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

< Символ преобразования > и < Модификатор > могут быть такими же, как в < формате вывода >. В случае использования в качестве символа форматирования f значение выводится в формате с фиксированной точкой.

Среди управляющих символьных констант наиболее часто используются следующие:

\а – кратковременная подача звукового сигнала;

\n – переход на новую строку;

\t – горизонтальная табуляция;

\v – вертикальная табуляция;

\b – возврат курсора назад на одну позицию;

\\ – вывод символа \;

\' – - вывод символа ';

\" – вывод символа ";

\? – вывод символа?.

Число выражений < списка вывода > должно совпадать с числом форматов вывода < шаблона >. Если выражений больше, то последние лишние выражения < списка вывода > игнорируются; если меньше, то последние лишние < форматы вывода > заполняются произвольными значениями.

Например, при вычислении значения printf("i=%ld; \n j=%6d, a=%6.2f.\n", i, j, a); при i=123456, j=456, a=86.531 в окно результатов будут выведены две строки:

I=123456;

J= 456, a= 86.53.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: