Программирование >>  Элементы языков с и с++ 

1 ... 17 18 19 [ 20 ] 21 22 23 ... 200


; Листинг 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), о которой мы



1 ... 17 18 19 [ 20 ] 21 22 23 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика