Курс на Си. Подбельский. Курс программирования на Си. В., Фомин С. С. Курс программирования на языке Си Учебник
Скачать 1.57 Mb.
|
Ввод-вывод строк. Одной из наиболее популярных операций ввода-вывода является операция ввода-вывода строки символов. В библиотеку языка Си для обмена со стандартными потоками ввода-вывода включены функции ввода-вывода строк gets( ) и puts( ). Прототипы этих функций имеют следующий вид: char * gets(char * s); /* Функция ввода */ int puts(char * s); /* Функция вывода */ Обе функции имеют только один аргумент - указатель s на массив символов. Если строка прочитана удачно, функция gets( ) возвращает адрес того массива s, в который производился ввод строки. Если произошла ошибка, то возвращается NULL. Функция puts( ) выводит в стандартный выходной поток символы из массива, адресованного аргументом. В случае успешного завершения возвращает последний выведенный символ, который всегда является символом '\n'. Если произошла ошибка, то возвращается EOF. Приведем простейший пример использования этих функций. #include char str1[ ] = "Введите фамилию сотрудника:"; int main() { char name[80]; puts(str1); gets(name); return 0; } Напомним, что любая строка символов в языке Си должна заканчиваться терминальным символом '\0'. В последний элемент массива str1 терминальный символ будет записан автоматически при инициализации массива. Для функции puts( ) наличие нуль- символа в конце строки является обязательным. В противном случае, то есть при отсутствии в символьном массиве символа '\0', программа может завершиться аварийно, так как функция puts( ) в поисках нуль-символа будет перебирать всю доступную память байт за байтом, начиная в нашем примере с адреса str1. Об этом необходимо помнить, если в программе происходит формирование строки для вывода ее на экран дисплея. Функция gets( ) завершает свою работу при вводе символа '\n', который автоматически передается от клавиатуры в ЭВМ при нажатии на клавишу Здесь следует обратить внимание на следующую особенность ввода данных с клавиатуры. Функция gets( ) начинает обработку информации от клавиатуры только после нажатия клавиши Форматный ввод-вывод. В состав стандартной библиотеки языка Си включены функции форматного ввода-вывода. Использование таких функций позволяет создавать программы, способные обрабатывать данные в заданном формате, а также осуществлять элементарный синтаксический анализ вводимой информации уже на этапе ее чтения. Функции форматного ввода-вывода предназначены для ввода-вывода отдельных символов, строк, целых восьмеричных, шестнадцатеричных, десятичных чисел и вещественных чисел всех типов. Для работы со стандартными потоками в режиме форматного ввода-вывода определены две функции: printf( ) - форматный вывод; scanf( ) - форматный ввод. Форматный вывод в стандартный выходной поток. Прототип функции printf( ) имеет вид: int printf(const char *format, . . .); При обращении к функции printf( ) возможны две формы задания первого параметра: int printf ( форматная_строка, список_аргументов); int printf ( указатель_на_форматную_строку, список_аргументов); В обоих случаях функция printf( ) преобразует данные из внутреннего представления в символьный вид в соответствии с форматной строкой и выводит их в выходной поток. Данные, которые преобразуются и выводятся, задаются как аргументы функции printf( ). Возвращаемое значение функции printf( ) - число напечатанных символов; а в случае ошибки - отрицательное число. Форматная_строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Текст и управляющие символы из форматной строки просто копируются в выходной поток. Форматная строка обычно размещается в списке аргументов функции, что соответствует первому варианту вызова функции printf( ). Второй вариант предполагает, что первый аргумент - это указатель типа char *, а сама форматная строка определена в программе как обычная строковая константа или переменная. В список аргументов функции printf( ) включают выражения, значения которых должны быть выведены из программы. Частные случаи этих выражений - переменные и константы. Количество аргументов и их типы должны соответствовать последовательности спецификаций преобразования в форматной строке. Для каждого аргумента должна быть указана точно одна спецификация преобразования. Если аргументов недостаточно для данной форматной строки, то результат зависит от реализации (от операционной системы и от системы программирования). Если аргументов больше, чем указано в форматной строке, «лишние» аргументы игнорируются. Список_аргументов (с предшествующей запятой) может отсутствовать. Спецификация преобразования имеет следующую форму: % флаги ширина_поля.точность модификатор спецификатор Символ % является признаком спецификации преобразования. В спецификации преобразования обязательными являются только два элемента: признак % и спецификатор. Спецификация преобразования не должна содержать внутри себя пробелов. Каждый элемент спецификации является одиночным символом или числом. Предупреждение. Спецификации преобразований должны соответствовать типу аргументов. При несовпадении не будет выдано сообщений об ошибках во время компиляции или выполнения программы, но в выводе результатов выполнения программы может содержаться произвольная информация. Начнем рассмотрение составных элементов спецификации преобразования с обязательного элемента - спецификатора, который определяет, как будет интерпретироваться соответствующий аргумент: как символ, как строка или как число (табл. 7.1). Таблица 7.1. Спецификаторы форматной строки для функции форматного вывода
Таблица 7.1. Спецификаторы форматной строки для функции форматного вывода (окончание)
Приведем примеры использования различных спецификаторов. В каждой строке с вызовом функции printf( ) в качестве комментариев приведены результаты вывода. Переменная code содержит код возврата функции printf( ) - число напечатанных символов при выводе значения переменной f. #include { int number = 27; float f = 123.456;
return 0; } Необязательные элементы спецификации преобразования управляют другими параметрами форматирования. Флаги управляют выравниванием вывода и печатью знака числа, пробелов, десятичной точки, префиксов восьмеричной и шестнадцатеричной систем счисления. Флаги могут отсутствовать, а если они есть, то могут стоять в любом порядке. Смысл флагов следующий: «-» - выводимое изображение значения прижимается к левому краю поля. По умолчанию, то есть при отсутствии этого флага, происходит выравнивание по правой границе поля; + - используется для обязательного вывода знака числа. Без этого флага знак выводится только при отрицательном значении; пробел - используется для вставки пробела на месте знака перед положительными числами; # - если этот флаг используется с форматами «o», «х» или «Х», то любое ненулевое значение выводится с предшествующим 0, 0х или 0Х соответственно. При использовании флага # с форматами «f», «g», «G» десятичная точка будет выводиться, даже если в числе нет дробной части. Примеры использования флагов: «%+d» - вывод знака '+' перед положительным целым десятичным числом; «% d» - добавление (вставка) пробела на месте знака перед положительным числом (использован флаг пробел после символа %); «%#о» - печать ведущих нулей в изображениях восьмеричных чисел. Ширина_поля, задаваемая в спецификации преобразования положительным целым числом, определяет минимальное количество позиций, отводимое для представления выводимого значения. Если число символов в выводимом значении меньше, чем ширина_поля, выводимое значение дополняется пробелами до заданной минимальной длины. Если ширина_поля задана с начальным нулем, не занятые значащими цифрами выводимого значения позиции слева заполняются нулями. Если число символов в изображении выводимого значения больше, чем определено в ширине_поля, или ширина_поля не задана, печатаются все символы выводимого значения. Точность указывается с помощью точки и необязательной последовательности десятичных цифр (отсутствие цифр эквивалентно 0). Точность задает: минимальное число цифр, которые могут быть выведены при использовании спецификаторов d, i, o, u, x или X; число цифр, которые будут выведены после десятичной точки при спецификаторах e, E и f; максимальное число значащих цифр при спецификаторах g и G; максимальное число символов, которые будут выведены при спецификаторе s. Непосредственно за точностью может быть указан модификатор, который определяет тип ожидаемого аргумента и задается следующими символами: |