Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Тут можно читать онлайн Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература, издательство Вильямс, год 0101. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - описание и краткое содержание, автор Стивен Прата, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать книгу онлайн бесплатно, автор Стивен Прата
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Символьные строки и строковые функции 439

Рис 113 Ширина поля и функция scanf Вспомните что функция scanf - фото 337

Рис. 11.3. Ширина поля и функция scanf()

Вспомните, что функция scanf() возвращает целочисленное значение, равное количеству успешно прочитанных элементов, или EOF при обнаружении конца файла.

В листинге 11.11 иллюстрируется работа функции scanf(), когда задана ширина поля.

Листинг 11.11. Программа scan_str .о

Вот результаты грех пробных запусков программы Введите два имени Джейн Покер - фото 338

Вот результаты грех пробных запусков программы:

Введите два имени.

Джейн Покер

Прочитано 2 имени: Джейн и Покер.

Введите два имени.

Иван Миттельшпиль

Прочитано 2 имени: Иван и Миттельшпи.

Введите два имени.

Вениамин Каверин

Прочитано 2 имени: Вениа и мин.

В первом запуске оба имени вписываются в разрешенные предельные размеры. Во втором запуске были прочитаны только первые 10 символов имени Миттельшпиль, поскольку мы применяем формат %10s. В третьем запуске в name2 попадают последние три буквы из имени Вениамин, т.к. второй ввод возобновляется там, где закончился первый ввод: в данном случае — внутри слова Вениамин.

В зависимости от природы желаемого ввода, для чтения текста с клавиатуры может быть удобнее пользоваться функцией fgets(). Например, функция scanf() не особенно подходит для ввода названия книги или песни, если только название не состоит из одного слова. Типичным применением scanf() является чтение и преобразование смеси данных разных типов в некоторой стандартной форме. Например, если входная строка содержит название инструмента, складской номер и цену за штуку, то можно воспользоваться scanf() либо написать собственную функцию, которая будет

1

440 Глава 11 выполнять проверку на предмет ошибок ввода. Если вы хотите обрабатывать ввод по слову за раз, можете применять scanf().

Функция scanf() страдает тем же потенциальным недостатком, что и gets(): она может приводить к переполнению, если вводимое слово не умещается в целевую область памяти. Но для предотвращения такого переполнения можно использовать параметр ширины поля в спецификаторе %s.

Вывод строк

Теперь давайте перейдем от ввода строк к их выводу. Мы снова будем применять библиотечные функции. Для вывода строк в С доступны три стандартных библиотечных функции: puts(), fputs() и printf().

Функция puts()

Функция puts() очень проста в использовании. Ей нужно только передать в качестве аргумента адрес строки. В листинге 11.12 демонстрируется несколько способов из множества доступных.

Листинг 11.12. Программа put out.с

Вывод имеет следующий вид Как и в предшествующих примерах каждая строка - фото 339

Вывод имеет следующий вид:

Как и в предшествующих примерах, каждая строка выводится в собственной строке, потому что при отображении строки функция puts() автоматически добавляет символ новой строки.

Этот пример напоминает, что фразы, заключенные в двойные кавычки, представляют собой строковые константы и трактуются как адреса. Кроме того, имена строковых массивов также считаются адресами. Выражение &strl [5] — это адрес шестого элемента в массиве strl. Этот элемент содержит символ ' в ', и именно он puts() применяет в качестве начальной точки. Аналогично, str2 + 4 указывает на ячейку памяти, содержащую второй символ 'а' из строки "Указатель", поэтому вывод начинается с него.

Символьные строки и строковые функции 441

Как функция puts() узнает, когда остановиться? Она прекращает вывод, когда встречает нулевой символ, так что лучше, чтобы он был в строке. Не повторяйте ошибку, проиллюстрированную в листинге 11.13!

Листинг 11.13. Программа nono.с

Поскольку в массиве dont отсутствует завершающий нулевой символ он не является - фото 340

Поскольку в массиве dont отсутствует завершающий нулевой символ, он не является строкой, поэтому функция puts() не знает, где остановиться. Она будет выводить содержимое ячеек памяти, следующих за dont, пока не обнаружит нулевой символ где- то в другом месте. Чтобы гарантировать, что нулевой символ не окажется слишком далеко, массив dont в программе хранится между двумя настоящими строками. Вот как выглядит вывод:

УРА!Сторона А

Использованный здесь компилятор разместил в памяти массив side_a после массива dont, так что функция puts() продолжает движение до тех пор, пока не наталкивается на нулевой символ в массиве side a. В зависимости от того, как ваш компилятор размещает данные в памяти, вы можете получить другие результаты. Что будет, если из программы убрать массивы side_a и side b? Обычно в памяти содержится много нулей, и при некоторой доле везения функция puts() сможет найти один из них довольно быстро, однако не стоит на это полагаться.

Функция fputs()

Функция fputs() представляет собой версию puts(), ориентированную на файлы. Важные отличия между ними описаны ниже.

• Функция fputs() принимает второй аргумент, указывающий файл, в который должна производиться запись. Для вывода на дисплей можно применять аргумент stdout (от standard output — стандартный вывод), который определен в

stdio.h.

• В отличие от puts(), функция fputs() не делает автоматическое дополнение вывода символом новой строки.

Обратите внимание, что gets() отбрасывает символ новой строки из введенных данных, но puts() добавляет его в вывод. С другой стороны, fgets() сохраняет символ новой строки во введенных данных, a fputs() не помещает его в вывод. Предположим, что вы хотите реализовать цикл, в котором строка читается и выводится в следующей строке на экране. Вы можете поступить так, как показано далее:

442 Глава 11 Вспомните что функция gets возвращает нулевой указатель если - фото 341

442 Глава 11

Вспомните, что функция gets() возвращает нулевой указатель, если обнаруживает конец файла. Нулевой указатель интерпретируется как ноль, или ложное значение, поэтому цикл прекращается. Либо можно поступить так:

char line[81];

while (fgets(line, 81, stdin)) fputs(line, stdout);

В первом цикле строка из массива line отображается в собственной строке на экране, поскольку puts() добавляет символ новой строки. Во втором цикле строка из массива line отображается в собственной строке на экране из-за того, что fgets() сохраняет символ новой строки.

Следует отметить, что если вы смешиваете ввод fgets() с выводом puts(), то получите по два символа новой строки для каждой строки на экране. Важно понимать, что функция puts() спроектирована для работы с gets(), а функция fputs() — для работы с fgets().

Разумеется, мы упомянули о функции gets() только для того, чтобы вы знали, как она работает, если вы встретите ее в коде, и вовсе не призываем пользоваться ею.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стивен Прата читать все книги автора по порядку

Стивен Прата - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Язык программирования C. Лекции и упражнения (6-е изд.) 2015 отзывы


Отзывы читателей о книге Язык программирования C. Лекции и упражнения (6-е изд.) 2015, автор: Стивен Прата. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x