Книга: Язык Си - руководство для начинающих
Форма данных
Форма данных
При написании программы необходимо понимать, как она будет взаимодействовать с входными данными. Сейчас мы обратимся к этому вопросу.
Вводимые данные должны быть представлены в форме, совместимой с требованиями, которые налагаются функциями ввода, используемыми в программе. Поэтому вся тяжесть приведения данных к правильной форме ложится на пользователя. В более сложных программах основной объем работы по такому преобразованию переносится на саму программу. Наилучшей формой представления вводимых данных является следующая:
Н 10 40
I 9 41
где за символом следуют номера начальной и конечной позиции. Но наша программа допускает также и такую форму данных:
Н
10
40
I
9
41
и такую
H10 40I 9 41
но не
Н 10 40 I 9 41
Почему наличие одних пробелов является необязательным, а других - обязательным? Почему символ "новая строка" может быть помещен между последним целым числом из одного набора данных и первым символом из следующего набора, а пробел нет?
Эти вопросы поднимают проблемы, касающиеся не только данной программы. Рассмотрим работу функций getchar() и putchar( ) и найдем ответы на них.
Функция getchar( ) читает первый встретившийся символ независимо от того, является ли он алфавитным символом, пробелом, символом "новая строка" или еще чем-нибудь. Функция scanf() делает то же самое, если чтение производится в формате %с (символ). Но, когда scanf( ) осуществляет ввод данных в формате %d (целые), пробелы и символы "новая строка" пропускаются. Поэтому символы "новая строка" или любые пробелы между символом, считываемым функцией getchar( ), и следующим целым числом, считываемым функцией scanf( ), игнорируются. Функция scanf( ) читает цифры до тех пор, пока не встретит нецифровой символ - пробел, символ "новая строка" или букву.
Следовательно, между первым и вторым целыми числами необходимо помещать пробел или символ "новая строка", чтобы функция scanf( ) могла распознать где кончается одно и начинается другое. Этим объясняется, почему между символом и следующим целым числом может стоять пробел или символ "новая строка", и почему между двумя целыми числами обязательно должен быть разделитель такого вида. Но почему между целым числом, стоящим в конце набора данных, и следующим символом не может быть пробел? Потому что в следующий раз на очередном шаге выполнения цикла while функция getchar( ) осуществляет ввод символа из той позиции, где "остановилась" функция scanf( ). Поэтому она прочтет любой следующий символ, стоящий после целого числа, - пробел, символ "новая строка" и т. п. Если бы мы следовали требованиям функции getchar( ), структуру данных необходимо было бы организовать так:
w10 50a20 60у10 30
где между последним целым числом, стоящим в конце группы, и следующим символом разделитель отсутствует. Но такая структура выглядит неуклюже, поскольку число 50 при этом выглядит так, как будто оно помещено в одну группу с а, а не с w. Поэтому введен оператор
if(ch != 'n')
чтобы иметь возможность обнаружить, когда значение ch равно символу "новая строка". Вместо этого можно использовать данные, вводимые в виде
w 10 50 а20 60 у10 30
где между числом 50 и а помещен символ "новая строка". Программа читает этот символ, игнорирует его и затем переходит к чтению следующего символа.
- Резервное копирование многофайловых баз данных
- Сохранение информации о пользователях при миграции
- Типы данных для работы с датой и временем
- Обзор основных причин повреждения базы данных
- Статистика базы данных InterBase
- Информация заголовочной страницы (Database header)
- Информация страниц данных
- Определение пользовательского формата числовых данных
- Рассмотрите возможность исключения необязательной информации перед отправкой данных на устройство
- Форматы данных, используемых при создании Web-узла
- Абстрактные типы данных и скрытие информации
- 14.6.3 Команды установки формата данных