ПЕРЕДАЧА ДАННЫХ ПОТОКОМ

Этот раздел посвящен дополнительным средствам ввода-вывода в языке 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 Привет