Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Puts в си это

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Урок 1. Часть 2: Инструкции языка Си printf, puts, putchar — вывод текста и других данных

Функция puts в Си

Функция puts в Си осуществляет вывод информации на экран. Параметром функции (параметр заключен в круглые скобки, именно он выводится на экран) могут быть данные одного из следующих типов:

    Вывод строкового литерала

begin writeln(‘Hello world!’); end.

var slovo: string; begin slovo:=’Hello world!’; writeln(slovo); end.

#define SLOVO «Hello world!» main()

const SLOVO=’Hello world!’; begin writeln(SLOVO); end.

Функция putchar в Си

Функция putchar в Си необходима для вывода единичного символа на экран. Параметром функции могут быть данные следующих типов:

    Вывод символьного литерала

#define C ‘H’ main()

В некоторых компиляторах при использовании функции putchar в Си необходимо подключить в код файл заголовков STDIO.H с помощью директивы #include. В подобных компиляторах функция putchar() является производной другой функции — putc(), которая осуществляет вывод на специальные устройства, такие как диск или принтер.

Пример подключения файла заголовка:

Escape символы в Си или управление перемещением курсора

В Си есть возможность управлять перемещением курсора на экране, т.е. переходить на другую строку, двигаться на n позиций в строны и т.п. Для этого используются специальные коды — escape-последовательности или escape-символы. Последовательность начинается с символа , который указывает на то, что символы, расположенные за ним, являются escape-символами. Компилятор, встречая обратную косую черту, не отображает следующие за ней символы, а выполняет действие, на которое они указывают.

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

После слова Ура! произойдет переход на начало следующей строки.

Отображает строку с цифрой в крайней левой позиции экрана и цифры от 1 до 5 через табуляцию

r – возврат каретки к началу той же строки :

puts («1r2»); // произойдет затирание

b – сдвиг курсора на одну позицию влево

‘ — отображает одинарную кавычку

» — отображает двойную кавычку

\ — отображает обратную косую черту

Язык Си printf — функция вывода информации

Языки Си и Си++ имеют более сложную и комплексную функцию для вывода информации, называемую printf(). Она позволяет выводить на экран данные любого типа и работать с несколькими аргументами.

Кроме того, функция Си printf() позволяет осуществлять так называемый форматированный вывод данных.

Самый обычный случай, когда функция printf() просто заменяет функцию puts() для вывода строки:

#define NOTE «Привет!» main()

Но целесообразней использовать функцию для осуществления форматированного вывода:

Программа выведет на экран «Mne ispolnilos 12 let».

Указатели формата:
%d целое число
%u беззнаковое целое число
%f вещественное число типа float или double
%e вещественное число в экспоненциальной форме
%c символ
%s строка

Арифметические операции в Си, оператор присваивания

+ сложение
– вычитание
* умножение
/ деление
% получение остатка от деления нацело

Оператор присваивания
= простое присваивание a=b
++ унарный инкремент a++ (или ++a)
— унарный декремент
+= a+=b если a=3, b=4, то a=7
–= a-=b
*= a*=b
/= a/=b
%= a%=b если a=10, b=3 то а=1

сhar item[] = «Винчестер»; float cost = 3000.50; float markup = 0.75;

Добавьте в программу функцию printf(), которая выводит на экран следующие сообщения:

Наименование товара: Жесткий диск Цена за 1 упаковку: 3000.50 Наценка: 0.75

Обратите внимание на выравнивание.

  • Что такое escape-последовательности?
  • В чем заключаются различия между escape-последовательностями n и r ?
  • Как вывести на экран символ «кавычка»?
  • Из каких двух частей состоит список параметров функции printf()?
  • Какие преимущества имеет функция printf() по сравнению с puts()?
  • Что такое указатель формата?

    Ввод и вывод символьных строк в Си

    Пожалуйста, приостановите работу AdBlock на этом сайте.

    Итак, строки в языке Си. Для них не предусмотрено отдельного типа данных, как это сделано во многих других языках программирования. В языке Си строка – это массив символов. Чтобы обозначить конец строки, используется символ ‘’ , о котором мы говорили в прошлой части этого урока. На экране он никак не отображается, поэтому посмотреть на него не получится.

    Создание и инициализация строки

    Так как строка – это массив символов, то объявление и инициализация строки аналогичны подобным операциям с одномерными массивами.

    Следующий код иллюстрирует различные способы инициализации строк.

    Рис.1 Объявление и инициализация строк

    В первой строке мы просто объявляем массив из десяти символов. Это даже не совсем строка, т.к. в ней отсутствует нуль-символ , пока это просто набор символов.

    Вторая строка. Простейший способ инициализации в лоб. Объявляем каждый символ по отдельности. Тут главное не забыть добавить нуль-символ .

    Третья строка – аналог второй строки. Обратите внимание на картинку. Т.к. символов в строке справа меньше, чем элементов в массиве, остальные элементы заполнятся .

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

    Как вывести строку

    Дополним код выше до полноценной программы, которая будет выводить созданные строки на экран.

    Рис.2 Различные способы вывода строки на экран

    Как видите, есть несколько основных способов вывести строку на экран.

    • использовать функцию printf со спецификатором %s
    • использовать функцию puts
    • использовать функцию fputs , указав в качестве второго параметра стандартный поток для вывода stdout .

    Единственный нюанс у функций puts и fputs . Обратите внимание, что функция puts переносит вывод на следующую строку, а функция fputs не переносит.

    Читать еще:  Язык си математические операции

    Как видите, с выводом всё достаточно просто.

    Ввод строк

    С вводом строк всё немного сложнее, чем с выводом. Простейшим способом будет являться следующее:

    Функция gets приостанавливает работу программы, читает строку символов, введенных с клавиатуры, и помещает в символьный массив, имя которого передаётся функции в качестве параметра.
    Завершением работы функции gets будет являться символ, соответствующий клавише ввод и записываемый в строку как нулевой символ.
    Заметили опасность? Если нет, то о ней вас любезно предупредит компилятор. Дело в том, что функция gets завершает работу только тогда, когда пользователь нажимает клавишу ввод. Это чревато тем, что мы можем выйти за рамки массива, в нашем случае — если введено более 20 символов.
    К слову, ранее ошибки переполнения буфера считались самым распространенным типом уязвимости. Они встречаются и сейчас, но использовать их для взлома программ стало гораздо сложнее.

    Итак, что мы имеем. У нас есть задача: записать строку в массив ограниченного размера. То есть, мы должны как-то контролировать количество символов, вводимых пользователем. И тут нам на помощь приходит функция fgets :

    Функция fgets принимает на вход три аргумента: переменную для записи строки, размер записываемой строки и имя потока, откуда взять данные для записи в строку, в данном случае — stdin . Как вы уже знаете из 3 урока, stdin – это стандартный поток ввода данных, обычно связанный с клавиатурой. Совсем необязательно данные должны поступать именно из потока stdin , в дальнейшем эту функцию мы также будем использовать для чтения данных из файлов.

    Если в ходе выполнения этой программы мы введем строку длиннее, чем 10 символов, в массив все равно будут записаны только 9 символов с начала и символ переноса строки, fgets «обрежет» строку под необходимую длину.

    Обратите внимание, функция fgets считывает не 10 символов, а 9 ! Как мы помним, в строках последний символ зарезервирован для нуль-символа.

    Давайте это проверим. Запустим программу из последнего листинга. И введём строку 1234567890 . На экран выведется строка 123456789 .

    Рис.3 Пример работы функции fgets

    Возникает вопрос. А куда делся десятый символ? А я отвечу. Он никуда не делся, он остался в потоке ввода. Выполните следующую программу.

    Вот результат её работы.

    Рис.4 Непустой буфер stdin

    Поясню произошедшее. Мы вызвали функцию fgets . Она открыла поток ввода и дождалась пока мы введём данные. Мы ввели с клавиатуры 1234567890n ( n я обозначаю нажатие клавиша Enter ). Это отправилось в поток ввода stdin . Функция fgets , как и полагается, взяла из потока ввода первые 9 символов 123456789 , добавила к ним нуль-символ и записала это в строку str . В потоке ввода осталось ещё 0n .

    Далее мы объявляем переменную h . Выводим её значение на экран. После чего вызываем функцию scanf . Тут-то ожидается, что мы можем что-то ввести, но т.к. в потоке ввода висит 0n , то функция scanf воспринимает это как наш ввод, и записывается 0 в переменную h . Далее мы выводим её на экран.

    Это, конечно, не совсем такое поведение, которое мы ожидаем. Чтобы справиться с этой проблемой, необходимо очистить буфер ввода после того, как мы считали из него строку, введённую пользователем. Для этого используется специальная функция fflush . У неё всего один параметр – поток, который нужно очистить.

    Исправим последний пример так, чтобы его работа была предсказуемой.

    Теперь программа будет работать так, как надо.

    Рис.4 Сброс буфера stdin функцией fflush

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

    Второй. Не забывайте очищать буфер ввода, если используете функцию fgets .

    На этом разговор о вводе строк закончен. Идём дальше.

    Практика

    Решите предложенные задачи:

    Для удобства работы сразу переходите в полноэкранный режим

    Исследовательские задачи для хакеров

    1. Проверьте как ведет себя ваш компилятор в случае переполнения буфера.

    Функции обработки строк в Cи

    В программе строки могут определяться следующим образом:

    • как строковые константы;
    • как массивы символов;
    • через указатель на символьный тип;
    • как массивы строк.

    Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

    Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .

    Для корректного вывода любая строка должна заканчиваться нуль-символом ‘’ , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

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

    Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘»‘ .

    Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .

    При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

    Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

    Читать еще:  Язык си define

    В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

    • m2 эквивалентно &m2[0]
    • m2[0] эквивалентно ‘Г’
    • m2[1] эквивалентно ‘o’
    • m3 эквивалентно &m3[0]
    • m3[2] эквивалентно ‘x’

    При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

    Для задания строки можно использовать указатель на символьный тип .

    В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

    Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

    Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

    Массивы символьных строк

    Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

    В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
    *poet[0] эквивалентно ‘П’,
    *poet[l] эквивалентно ‘-‘.

    Инициализация выполняется по правилам, определенным для массивов.
    Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
    последовательности.
    Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

    Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

    Свободный массив

    Операции со строками

    Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

    • выделить блок оперативной памяти под массив;
    • проинициализировать строку.

    Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:

    Для ввода строки использована функция scanf() , причем введенная строка не может превышать 9 символов. Последний символ будет содержать ‘’ .

    Функции ввода строк

    Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат «%s» для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

    Для ввода строки, включая пробелы, используется функция

    В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.

    Функции вывода строк

    Для вывода строк можно воспользоваться рассмотренной ранее функцией

    или в сокращенном формате

    Для вывода строк также может использоваться функция

    которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

    Функция ввода символов

    Для ввода символов может использоваться функция

    которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.

    Функция вывода символов

    Для вывода символов может использоваться функция

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

    Пример Посчитать количество введенных символов во введенной строке.

    Результат выполнения

    Основные функции стандартной библиотеки string.h

    Основные функции стандартной библиотеки string.h приведены в таблице.

    ФункцияОписание
    присоединяет s2 к s1, возвращает s1
    присоединяет не более n символов s2 к s1, завершает строку символом ‘’, возвращает s1
    копирует строку s2 в строку s1, включая ‘’, возвращает s1
    копирует не более n символов строки s2 в строку s1, возвращает s1;
    сравнивает s1 и s2, возвращает значение 0, если строки эквивалентны
    сравнивает не более n символов строк s1 и s2, возвращает значение 0, если начальные n символов строк эквивалентны
    возвращает количество символов в строке s
    заполняет строку s символами, код которых равен значению c, возвращает указатель на строку s
    заменяет первые n символов строки s символами, код которых равен c, возвращает указатель на строку s

    Пример использования функций

    Результат выполнения

    Puts в си это

    Под вводом-выводом в программировании понимается процесс обмена информацией между оперативной памятью и внешними устройствами: клавиатурой, дисплеем, магнитными накопителя­ми и т. п. Ввод — это занесение информации с внешних устройств в оперативную память, а вывод — вынос информации из опера­тивной памяти на внешние устройства. Такие устройства, как дис­плей и принтер, предназначены только для вывода; клавиатура — устройство ввода. Магнитные накопители (диски, ленты) исполь­зуются как для ввода, так и для вывода.

    Основным понятием, связанным с информацией на внешних устройствах ЭВМ, является понятие файла. Всякая операция вво­да-вывода трактуется как операция обмена с файлами: ввод — это чтение из файла в оперативную память; вывод — запись инфор­мации из оперативной памяти в файл. Поэтому вопрос об органи­зации в языке программирования ввода-вывода сводится к вопро­су об организации работы с файлами.

    Внутренний файл — это переменная файлового типа, являющаяся структурированной величиной. Элементы файловой переменной могут иметь разный тип и, со­ответственно, разную длину и форму внутреннего представле­ния. Внутренний файл связывается с внешним (физическим) файлом с помощью стандартной процедуры Assign. Один эле­мент файловой переменной становится отдельной записью во внешнем файле и может быть прочитан или записан с помощью одной команды. Попытка записать в файл или прочитать из него величину, не совпадающую по типу с типом элементов файла, приводит к ошибке.

    Аналогом понятия внутреннего файла в языках Си/Си++ яв­ляется понятие потока. Поток — это байтовая последовательность, передаваемая в про­цессе ввода-вывода.

    Поток должен быть связан с каким-либо внешним устройством или файлом на диске. В терминологии Си это звучит так; поток должен быть направлен на какое-то устройство или файл.

    Основные отличия файлов в Си состоят в следующем: здесь отсутствует понятие типа файла и, следовательно, фиксирован­ной структуры записи файла. Любой файл рассматривается как байтовая последовательность:

    Стрелочкой обозначен указатель файла, определяющий теку­щий байт файла. EOF является стандартной константой — призна­ком конца файла.

    Существуют стандартные потоки и потоки, объявляемые в про­грамме. Последние обычно связываются с файлами на диске, со­здаваемыми программистом. Стандартные потоки назначаются и открываются системой автоматически. С началом работы любой программы открываются 5 стандартных потоков, из которых ос­новными являются следующие:

    o stdin — поток стандартного ввода (обычно связан с клавиатурой);

    o stdout — поток стандартного вывода (обычно связан с дисплеем);

    o stderr — вывод сообщений об ошибках (связан с диспле­ем).

    Кроме этого, открывается поток для стандартной печати и до­полнительный поток для последовательного порта.

    Работая ранее с программами на Си, используя функции вво­да с клавиатуры и вывода на экран, мы уже неявно имели дело с первыми двумя потоками. А сообщения об ошибках, которые система выводила на экран, относились к третьему стандартному потоку. Поток для работы с дисковым файлом должен быть от­крыт в программе.

    Работа с файлами на диске. Работа с дисковым файлом начи­нается с объявления указателя на поток. Формат такого объяв­ления:

    Слово file является стандартным именем структурного типа, объявленного в заголовочном файле stdio.h. В структуре file содержится информация, с помощью которой ведется работа с потоком, в частности: указатель на буфер, указатель (индикатор) текущей позиции в потоке и т.д.

    Следующий шаг — открытие потока, которое производится с помощью стандартной функции fopen (). Эта функция возвраща­ет конкретное значение для указателя на поток и поэтому ее зна­чение присваивается объявленному ранее указателю. Соответству­ющий оператор имеет формат:

    Имя_указателя=fореn (“имя_файла”, “режим_открытия”) ;

    Параметры функции fopen () являются строками, которые мо­гут быть как константами, так и указателями на символьные мас­сивы. Например:

    Здесь test .dat — это имя физического файла в текущем ката­логе диска, с которым теперь будет связан поток с указателем fр. Параметр режима r означает, что файл открыт для чтения. Что касается терминологии, то допустимо употреблять как выражение «открытие потока», так и выражение «открытие файла».

    Существуют следующие режимы открытия потока и соответ­ствующие им параметры:

    r открыть для чтения

    w создать для записи

    а открыть для добавления

    r+ открыть для чтения и записи

    w+ создать для чтения и записи

    а+ открыть для добавления или

    создать для чтения и записи

    Поток может быть открыт либо для текстового, либо для дво­ичного (бинарного) режима обмена.

    Понятие текстового файла: это последовательность символов, которая делится на строки специальными кодами — возврат ка­ретки (код 13) и перевод строки (код 10). Если файл открыт в текстовом режиме, то при чтении из такого файла комбинация символов «возврат каретки — перевод строки» преобразуется в один символ n — переход к новой строке.

    При записи в файл осуществляется обратное преобразование. При работе с двоичным файлом никаких преобразований симво­лов не происходит, т.е. информация переносится без всяких из­менений.

    Указанные выше параметры режимов открывают текстовые файлы. Если требуется указать на двоичный файл, то к параметру добавляется буква b. Например: rb, или « b », или r +b. В некоторых компиляторах текстовый режим обмена обозначается буквой t, т.е. записывается a+t или rt.

    Если при открытии потока по какой-либо причине возникла ошибка, то функция fopen() возвращает значение константы null. Эта константа также определена в файле stdio.h. Ошибка может возникнуть из-за отсутствия открываемого файла на диске, нехватки места в динамической памяти и т.п. Поэтому желатель­но контролировать правильность прохождения процедуры откры­тия файла. Рекомендуется следующий способ открытия:

    if (fp=fopen(«test.dat», «r»)==NULL)

    В случае ошибки программа завершит выполнение с закрыти­ем всех ранее открытых файлов.

    Закрытие потока (файла) осуществляет функция fclose(), прототип которой имеет вид:

    int fclose(FILE *fptr);

    Здесь fptr обозначает формальное имя указателя на закрыва­емый поток. Функция возвращает ноль, если операция закрытия прошла успешно. Другая величина означает ошибку.

    Запись и чтение символов. Запись символов в поток произво­дится функцией putc() с прототипом

    int putc (int ch, FILE *fptr);

    Если операция прошла успешно, то возвращается записанный символ. В случае ошибки возвращается константа EOF.

    Считывание символа из потока, открытого для чтения, произ­водится функцией gets () с прототипом

    int gets (FILE *fptr);

    Функция возвращает значение считываемого из файла сим­вола. Если достигнут конец файла, то возвращается значение EOF. Заметим, что это происходит лишь в результате чтения кода EOF.

    Исторически сложилось так, что gets() возвращает значение типа int. To же можно сказать и про аргумент ch в описании функции puts(). Используется же в обоих случаях только млад­ший байт. Поэтому обмен при обращении может происходить и с переменными типа char.

    Пример 1. Составим программу записи в файл символьной пос­ледовательности, вводимой с клавиатуры. Пусть признаком завер­шения ввода будет символ *.

  • Ссылка на основную публикацию
    Adblock
    detector