Поток информации для getint( )

Поток информации для getint( )

     Какой выход должна иметь наша функция? Во-первых, несомненно, что она должна была бы выдавать значение прочитанного числа. Конечно, функция scanf( ) уже делает так. Во-вторых, и это очень существенно, мы собираемся создать такую функцию, которая будет выдавать сообщения о состоянии, т. е. найдено или нет целое число. Чтобы функция была действительно полезной, она должна также сообщать о нахождении ею символа EOF. Тогда мы могли бы использовать функцию getint( ) в цикле while, который читает целые числа до тех пор, пока не обнаружит символ EOF. Короче говоря, нам нужно, чтобы getint( ) возвращала два значения: целое числе и состояние.

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

status = scanf(" % d", &number);

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

status = getint(&number);

Правая часть равенства использует адрес переменной number, чтобы получить ее значение, a returnприменяется для получения значения переменной status.

  

РИС. 10.2. Создание функции getint( )

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

-1 означает, что найден символ EOF.

1 означает, что найдена строка, содержащая не цифры.

0 означает, что найдена строка, содержащая только цифры.

     Нашу функцию getint( ) можно представить себе (рис. 10.2) как имеющую один вход и два выхода. На ее вход поступает адрес целой переменной, значение которой считывается. На первом выходе имеем значение считанного целого, полученного через указатель. (Таким образом, аргумент-указатель является двусторонним каналом передачи информации.) На втором выходе получаем код состояния, что обеспечивается функциейreturn. Отсюда следует, что "скелет" нашей функции должен выглядеть примерно так:

getint(ptint)

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

{

int status;

...

return (status);

}

Замечательно! Теперь мы должны просто заполнить внутренность функции.