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

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

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

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

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

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

Интервал:

Закладка:

Сделать

Чтобы продемонстрировать проблемы, которые при этом возникают, в листинге 8.5 представлена программа, которая в качестве ввода считывает символ и два числа. Затем она выводит таблицу с этим символом, имеющую столько строк и столбцов, сколько было указано во введенных числах.

Листинг8.5. Программа showchar1.c

Символьный вводвывод и проверка достоверности ввода 309 Обратите внимание - фото 223

Символьный ввод-вывод и проверка достоверности ввода 309

Обратите внимание на то что программа читает символ как тип int чтобы сделать - фото 224

Обратите внимание на то, что программа читает символ как тип int, чтобы сделать возможной проверку на EOF. Однако она передает этот символ функции display() как тип char. Поскольку char меньше int, некоторые компиляторы предупредят о преобразовании. В данном случае предупреждение можно проигнорировать. Или же вывод предупреждения можно предотвратить, добавив приведение типа:

display(char(ch) , rows, cols);

Программа устроена так, что функция main() получает данные, а функция display() производит вывод. Давайте взглянем на результаты выполнения программы, чтобы увидеть, в чем заключается проблема:

Введите символ и два целых числа:

с 2 3

ссс

ссс

Введите еще один символ и два целых числа;

для завершения введите символ новой строки.

Программа завершена.

Сначала программа работает хорошо. Вы вводите с 2 3, а программа выводит две строки по три символа с, как и ожидалось. Затем она предлагает ввести следующий набор данных и завершает работу, прежде чем вы сможете ответить. Что пошло не так? Проблема снова с символом новой строки, на этот раз с тем, который находится непосредственно после числа 3 в первой введенной строке. Функция scanf() оставляет его во входной очереди. В отличие от scanf(), функция getchar() не пропускает символов новой строки, так что этот символ читается getchar() на следующей итерации цикла, прежде чем вы получите возможность ввести что-либо еще. Затем он присваивается переменной ch, а равенство ch символу новой строки означает завершение цикла.

Чтобы устранить эту проблему, программа должна пропускать любые символы новой строки или пробелы между последним числом, набранным в одном цикле ввода, и первым символом, набираемым в следующей строке. Кроме того, было бы неплохо, если бы в дополнение к проверке getchar() программу можно было прекратить на стадии выполнения функции scanf(). Все это реализовано в следующей версии программы, показанной в листинге 8.6.

Листинг8.6. Программа showchar2.c

310 Глава 8 Оператор while заставляет программу пропускать все символы - фото 225

310 Глава 8

Оператор while заставляет программу пропускать все символы следующие за вводом - фото 226

Оператор while заставляет программу пропускать все символы, следующие за вводом scanf(), включая символ новой строки. Это подготавливает цикл для чтения первого символа в начале следующей строки. Другими словами, данные можно вводить без ограничений:

Введите символ и два целых числа: с 1 2

сс

Введите еще один символ и два целых числа; для завершения введите символ новой строки.

! 3 б !!!!!!

!!!!!!

!!!!!!

Введите еще один символ и два целых числа; для завершения введите символ новой строки.

Программа завершена.

За счет использования оператора if вместе с break мы завершаем выполнение программы, если значение, возвращаемое функцией scanf(), не равно 2. Это происходит, когда одно или оба входных значения не являются целыми числами или встретился символ конца файла.

Проверка допустимости ввода

На практике пользователи программ не всегда следуют инструкциям, и вполне может возникнуть несоответствие между тем, что программа ожидает в качестве ввода, и тем, что в действительности она получает. Такие условия могут привести к аварий-

Символьный ввод-вывод и проверка достоверности ввода 311

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

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

Еще одна потенциальная ловушка связана с тем, что пользователь может ввести значение неподходящего типа, такое как символ q. Один из способов обнаружения такого вида ошибок предполагает проверку возвращаемого значения функции scanf(). Как вы помните, она возвращает количество успешно прочитанных элементов; таким образом, выражение будет истинным, только если пользователь вводит целое число. Это требует внесения в код следующего изменения:

Условие цикла while звучит так: “пока ввод является целочисленным значением и это значение положительно".

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

312 Глава 8 Функция get long пытается прочитать значение типа int в - фото 227

312 Глава 8

Функция get long() пытается прочитать значение типа int в переменную input. Если ей это не удастся, происходит вход в тело внешнего цикла while. Затем во внуг рением цикле while выполняется посимвольное чтение проблемного ввода. Обратите внимание, что функция выбран вариант с отбрасыванием всего, что осталось во входной строке. Другим возможным вариантом может быть отбрасывание следующего символа или слова. Далее функция предлагает пользователю повторить попытку ввода. Внешний цикл продолжает выполняться до тех пор, пока пользователь успешно не введет целое число, что приведет к возврату scanf() значения 1.

После того, как пользователь преодолеет все препятствия, не позволяющие ему вводить целые числа, программа может выяснить, допустимы ли введенные значения. Рассмотрим пример, в котором пользователю требуется ввести верхний и нижний пределы, определяющие диапазон значений. В этом случае в программе наверняка понадобится проверка, не превышает ли первое значение второе (обычно при указании диапазонов предполагается, что первое значение меньше второго). Также может стать необходимой проверка вхождения обоих значений в приемлемые пределы. К примеру, поиск в архиве может не работать со значениями для года, которые меньше 1958 или больше 2014. Такую проверку также имеет смысл реализовать в виде функции.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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