На этом шаге мы рассмотрим особенности создания такой функции.
Создадим функцию, вводящую строку символов с клавиатуры и возвращаю щую длину введенной строки. Такая функция getline() представлена ниже.
int getline(char s[],int lim) { int c,i; for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++) s[i]=c; s[i]='\0'; i++; //для учета количества return i; }
Входным параметром функции является lim - ограничитель на количество вводимых в строку символов. Дело в том, что в языке С строка символов представляется в виде массива символов, а любой массив имеет свою конкретную размерность (количество элементов). Поэтому если символы будут вводиться в массив s[], размерность которого указана в вызывающей программе, то мы должны задавать параметр lim, значение которого не должно превосходить размерности массива (т. е. определенной длины строки). При определении функции можно писать s[], не указывая конкретной размерности, что удобно, т. к. такую функцию можно использовать в различных случаях, задавая разные размерности.
Далее идет знакомый нам обычный цикл ввода по символу, организованный с помощью циклической конструкции for. Введенный функцией getchar() символ присваивается очередному элементу массива s[], так формируется строка. Ввод обеспечивается необходимостью вычисления условия продолжения/завершения цикла (цикл идет по переменной i):
i<lim-1 && (c=getchar()) != eof && c != '\n';
В момент вычисления этого выражения требуется ввести один символ с клавиатуры, иначе выражение не может быть вычислено. Цикл ввода может завершиться при нарушении хотя бы одного из выражений, связанных операцией "и":
Первым в сложном условии продолжения/окончания цикла стоит выражение:
i<lim-1
Когда цикл ввода закончится, к введенным символам надо добавить признак конца строки, иначе строка в дальнейшем не сможет обрабатываться как строка. Этот символ добавляется и с его учетом корректируется количество введенных символов: к i добавляется единица, т. к. значение этой переменной фактически равно количеству введенных символов, хотя прямое назначение переменной i - формировать порядковый номер элемента массива, в который будет записываться очередной введенный символ.
Оператор return i возвращает количество введенных символов. Здесь следует различать возвращаемые функцией значения. Результат ввода возвращается не только через возврат количества введенных символов, но и через массив s[], который играет роль выходного параметра.
Когда определяют функцию как подпрограмму, возвращающую обязательно какое-то значение, то имеют в виду, что речь идет о значениях, которые возвращает оператор return, а не о выходных параметрах. Если бы наш функция не возвращала количество введенных символов, то она "ничего не возвращала", и тогда мы бы определили тип возвращаемого значения как void. Функция, которая имеет тип void, не возвращает ничего. Функция может что-то возвращать, но не иметь совсем параметров. Тогда при ее создании пишут, например, float aaa(void) или float aaa(), а обращение к ней пойдет как float у=ааа().
Итак, мы заметили, что параметры функции могут быть входными и выходными, и что не следует путать с ними возвращаемые значения.
Детально посмотреть как работает функция или любая другая программ можно, воспользовавшись программой-отладчиком (Debugger), о которой мы упоминали на 17 шаге. Напомним, что включить его можно в любой точке программы, щелкнув мышью в поле подшивки Редактора текстов.
При этом в поле подшивки редактора появится красный кружочек. Убрать точку останова (Breakpoint) можно, повторно щелкнув на красном кружочке. Запуск программы на выполнение должен осуществляться либо с помощью нг жатия клавиши F5, либо посредством команды Debug | Start Debugging (Отладка | Начать отладку). В обоих случаях включается режим отладки программы. От образовавшейся точки останова можно либо войти внутрь некоторой функции, нажав на клавишу F11, если мы остановились на этой функции, и тем самым проследить как она пошагово выполняется, либо дальше двигаться по тексту программы шаг за шагом, нажимая клавишу F10. При этом будут одновременно выполняться все операторы, находящиеся в той строке, на которую указывает желтая стрелка. Эта стрелка образуется в поле подшивки, когда после пуска програм мы происходит останов на заданной точке, и когда мы начинаем двигаться дальше с помощью клавиши F10, выполняя одну строку за другой. В этом случае мы имеем возможность просмотра значений переменных, что очень важно для процесса отладки программы: достаточно навести на имя переменной указатель мыши и немного подождать, как рядом с указателем мыши появится изображение содержимого переменной (рисунок 1).
Рис.1. Подключение отладчика к программе
На следующем шаге мы продолжим изучение этого вопроса.