|
Программирование >> Элементы языков с и с++
; Листинг 4.1 ......... /♦Возвращает длину введенной строки с учетом \0 символа; lim-максимальное количество символов, которое можно ввести в строку s[] */ int getiine(char s[],int lim) { int c,i; for(i=0; i<lim-l && (c=getchar()) 1= eof && с != \n; i++) s[i]=c; s[i]=\0; i++; для учета количества символов return(i); Входным параметром функции является lim- ограничитель на количество вводимых в строку символов. Дело в том, что в языке С строка символов представляется в виде массива символов (об этом мы говорили в предыдущей главе), а любой массив имеет свою конкретную размерность (количество элементов). Поэтому если символы будут вводиться в массив s [ ], размерность которого указана в вызывающей программе, то мы должны задавать параметр lim, значение которого не должно превосходить размерности массива (т. е. определенной длины строки). При определении функции можно писать S [ ], не указывая конкретной размерности, что удобно, т. к. такую функцию можно использовать в различных случаях, задавая разные размерности. Далее идет знакомый нам обычный цикл ввода по символу, организованный с помощью оператора for. Введенный функцией getchar о символ присваивается очередному элементу массива s[], чем и формируется строка. Ввод обеспечивается необходимостью вычисления условия продолжения/завершения цикла (цикл идет по переменной i): i<lim-l && (c=getcharО) != eof && с != \п; Ввод строки с клавиатуры Создадим функцию, вводящую строку символов с клавиатуры и возвращающую длину введенной строки. Такая функция getiine () представлена в листинге 4.1. В момент вычисления этого выражения требуется ввести один символ с клавиатуры, иначе выражение не может быть вычислено. Цикл ввода может завершиться при нарушении хотя бы одного из выражений, связанных операцией и : □ номер введенного символа (i) превзойдет ограничитель lim (в условии стой! i<iim-i, потому что номср последнего элемента массива, размерность которого lim, будет lim-i, а надо еще оставить место и для признака конца строки \о); □ будет введен признак конца ввода (он должен быть задан в вызывающей программе так, чтобы был известен в этой функции); □ ввод строки завершится, когда будет введен признак конца строки символ \п. Первым в сложном условии продолжения/окончания цикла стоит выражение: i<lim-l поскольку в языке С при вычислении такого рода выражений действует правило: если при вычислении части выражения становится ясным его значение, то вычисление всего выражения завершается. Этот принцип обеспечивает повышение скорости обработки. Поэтому если обнаружится, что выражение i<iim-i нарушено (т. е. количество вводимых символов превзойдет размерность массива), то не потребуется вводить очередной символ и проверять его на признак конца строки. Когда цикл ввода закончится, к введенным символам надо добавить признак конца строки, иначе строка в дальнейшем не сможет обрабатываться как строка. Этот символ добавляется и с его учетом корректируется количество введенных символов: к i добавляется единица, т. к. значение этой переменной фактически равно количеству введенных символов, хотя прямое назначение переменной i- формировать порядковый номер элемента массива, в который будет записываться очередной введенный символ. Оператор return(i) возвращает количество введенных символов. Здесь следует различать возвращаемые функцией значения. Результат ввода возвращается не только через возврат количества введенных символов, но и через массив s [], который играет роль выходного параметра. ( Примечание Это возможно, потому что S (точнее s [ о ]) - это адрес первого элемента массива, как определено в языке С Мы уже говорили, что в теле функции можно изменять значения тех переменных, которые передают в функцию не свои значения, а свои адреса. Массив s [ ] передан в функцию своим начальным адресом. Вот мы и изменили значение переменной s [ ]. Когда определяют функцию как подпрограмму, возвращающую обязательно какое-то значение, то имеют в виду, что речь идет о значениях, которые возвращает оператор return о, а не о выходных параметрах. Если бы наща функция не возвращала количество введенных символов, то она ничего бы не воз- I вращала , и тогда бы мы определили тип возвращаемого значения как void. Функция, которая имеет тип void, не возвращает ничего. Функция может что-то возвращать, но не иметь совсем параметров. Тогда при ее создании пишут, например, float ааа (void), а обращение к ней пойдет как float у=ааа (). Итак, мы заметили, что параметры функции могут быть входными и выходными, и что не следует путать с ними возвращаемые значения. Точка останова 13 Visual с 200В Ехргеп Edition File Eck View Proiect Ви Л Debug Tools ..3- Jj- .J? H A J-.J 3 i. J - Wndow I ► Debug - Win32 iiiffli.iJiiM , >3xpp Start Page [(Oobal scope) Л, ♦ tmainO dvoid copylcnar saved,cbar line[]) I int i-0; while((9ave[l]-line[i]) \C) . i++; > (3 ----------------------------------------- В int tinain() char s[tnaxline] ,v[tnaxline] , w[tnaxline].; printf ( EiiceL- you 3Cfing\ri ) ; int l-getllne (s,tnaxline] ; copy(v, =1 ; substc (w, V* from, hovmany) ; if((i-l) < from) ( Value Ox0012fb78 asdf S OxOOI2f78e~ - * X c. Type . Lang CI - char [100 J Ct* rk , с 4-char[iaO С A - char [100 Текущие значения переменных (если переменные не простые, их можно разворачивать и сворачивать) Рис. 4.1. Подключение отладчика к программе Детально посмотреть, как работает функция или любая другая программа, можно, воспользовавшись программой-отладчиком (Debugger), о которой мы
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |