Книга: Язык Си - руководство для начинающих

Содержание getint( )

Содержание getint( )

     Наш основной план для getint( ) в общих чертах на псевдокоде выглядит примерно так:

читаем на входе информацию в виде символов

помещаем символы в строку, пока не встретим символ EOF

если встретился символ EOF, устанавливаем состояние в STOP

в противном случае проверяем строку,

преобразуем символы в целое число, если возможно, и выдаем сообщение о состоянии (YESNUM или NONUM).

Здесь мы используем STOP, YESNUM и NONUM как символические константы, равные -1, 0 и 1, как описано выше.

     Рассмотрим еще некоторые вопросы. Как функция будет решать, что она достигла конца входной строки? Должны ли мы ограничивать длину строки?

     Мы вошли в область, где нам предстоит решать, что предпочесть: удобство программиста или удобство пользователя. Самым простым было бы предложить пользователю нажимать на клавишу [ввод], когда строку надо закончить. Это означало бы один ввод на строку. Для пользователя все же было бы приятнее, если бы функция могла размещать несколько чисел в одной и той же строке:

2   34    4542    2    98

Мы решили предоставить привилегию пользователю. Пусть функция будет считать, что строка начинается с символа, не являющегося пробелом или "новой строкой", и заканчивается символом пробела или "новой строкой". Такой ввод может производиться в одну строку или в несколько строк.

Мы ограничим вводимую строку 80 символами. Так как строки заканчиваются нуль-символом, нам нужен массив из 81 символа для включения в него этого символа. Это слишком щедро, потому что нам нужно только 6 символов для 16-разрядного целого числа и знака. Вы можете вводить более длинные числа, но их размер будет сокращен до размера строки.

Чтобы сделать программу более модульной, мы поручим преобразование "строка в целое число" другой функции, и назовем ее stoi( ). У нас будет также возврат функцией stoi( ) соответствующего кода состояния в функцию getint( ), a getint( ), в свою очередь, может передать код состояния своей вызывающей программе. Функция stoi( ) выполнит последние две строки нашего плана (на псевдокоде).

     Рис. 10.3 представляет программу для функции getint( );. Функция stoi( ) будет показана позже:

/* getint( ) */

#include

#define LEN 81 /* максимальная длина строки */

#define STOP-1 /* коды состояний */

#define NONUM 1

#define YESNUM О

getint(ptint)

int  *ptint; /* указатель на вывод целого числа */

{

char intarr[LEN]; /* запоминание вводимой строки */

int ch;

int ind = 0; /* индекс массива */

while((ch = getchar( )) = = 'n' || ch == '  ' || ch == 't');

/* обход начальных символов "новая строка", пробелов и табуляций */

while(ch != EOF && ch != 'n' && ch != '   ' && ind < LEM)

{

intarr[ind++] = ch; /* запись символа в массив */

ch = getchar( ); /* получение очередного символа */

}

intarr[ind] = ''; /* конец массива по нуль-символу */

if(ch == EOF)

return(STOP);

else                                                            

return(stoi(intarr, ptint) ); /* выполнение преобразования */

}

РИС. 10.3. Программа функции getint( )

     Мы получаем символ сh. Если он является символом пробела, или "новой строки", или табуляции, мы берем следующий символ и так продолжаем до тех пор, пока не получим символ, отличающийся от перечисленных. Затем, если этот символ не EOF, помещаем его в массив. Продолжаем брать символы и помещать их в массив, пока не найдем запрещенный символ или не достигнем предельного размера строки. Далее помещаем нуль-символ (' ') в следующую позицию массива, чтобы отметить конец строки. Таким образом, мы создали массив в виде стандартной символьной строки. Если EOF был последним прочитанным символом, возвращаем STOP; иначе идем дальше и пытаемся преобразовать строку. Мы вызываем новую функцию stoi( ), чтобы выполнить эту работу. Что делает stoi( )? При вводе она берет символьную строку и указатель на целую переменную, использует указатель для присваивания значения самой переменной, а также return для пересылки сообщения о состоянии, которое getint( ) передает затем функции getarray( ). Поразительно! Двойная игра! Вот менее компактный способ использования функции stoi( ):

status = stoi(intarr, print);

return (status);

Здесь status была бы переменной типа int. Первый оператор дает значение, на которое указывает ptint; она также присваивает значение переменной status. Второй оператор возвращает это значение программе, которая вызвала getint( ). Наша единственная строка программы имеет точно такой же эффект, за исключением того, что нам не нужна промежуточная переменная status. Теперь напишем функцию stoi( ).

Оглавление книги


Генерация: 0.082. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз