Этот раздел посвящен дополнительным средствам ввода-вывода в языке C, используемых для ввода-вывода символьной информации. Средства языка Basic для ввода с клавиатуры и вывода на экран и принтер не рассматриваются, поскольку они входят в состав визуальных средств и будут излагаться в последующих курсах программирования.
Функции scanfи printf и некоторые другие, о которых речь пойдет ниже, называют функциями передачи данных потоком. Это означает, что все данные, вводимые последовательными инструкциями scanf, образуют единый поток ввода, в котором начало и конец элемента данных определяются параметром соответствующей спецификации wили d либо специальными символами – ограничителями, внесенными в поток. Аналогично последовательность инструкций printfобразует единый поток вывода. Проще всего данные каждого потока представить в виде непрерывной символьной строки.
В языке определены 3 стандартных потока обмена данных: поток ввода stdin, поток вывода stdout и поток сообщений об ошибках stderr. По умолчанию поток stdinсвязан с клавиатурой, потоки stdout и stderr – с экраном монитора. На самом деле поток stdin также связан с экраном, поскольку большинство функций ввода отображают каждый вводимый с клавиатуры символ на экран. Точнее эти функции вставляют отображение вводимых символов в поток stdout. Это приводит к очереди за пользование ресурсом (экраном) и иногда к конфликтным ситуациям, описанным ранее.
12.1. Спецификация "s" управляющей строки функций scanf и printf
Предназначена для ввода-вывода символьных строк. Напомним, что в языке C определены только строковые литералы, которые представляют собой последовательность символов, завершающуюся нулевым символом. В качестве переменных применяются массивы типа char. Все функции ввода строк добавляют конечный нулевой символ.
Ввод. Формат спецификации: % [w]s.
Поле ввода ограничивается параметром спецификации wлибо символами пробел или перевод строки (клавиша Enter).
Пример.
%5s [Ивано]в // Будет введен текст, заключенный в [ ]
Замечание. Ограничитель ввода остается в потоке и будет восприниматься последующими инструкциями ввода, что может привести к некоторым неожиданным последствиям. Например следующая за функцией scanf функция gets, у которой символ перевод строки является ограничителем, введет пустую строку.
Вывод. Формат спецификации %[w][.d]s.
Ограничителем является конечный нулевой символ либо параметр d спецификации.
Пример. Выводимая строка имеет значение: "Привет, Коля!". На экране получим:
%s Привет, Коля!
%.6s Привет