|
Программирование >> Элементы языков с и с++
Функция выделения подстроки из строки Пример профаммы с функцией substr () представлен в листинге 4.2. Листинг 4.2 void substr(char v[],char s[],int n,int m) { говорили в предыдущей главе. Напомним, что включить его можно в любой точке программы, щелкнув мышью в поле подшивки Редактора текстов (рис. 4.1). При этом в поле подшивки редактора появится красный кружочек, а соответствующая строка подсветится красным. Убрать точку останова (Breakpoint) можно, повторно щелкнув на красном кружочке. Запуск программы на выполнение должен осуществляться либо с помощью нажатия клавиши <F5>, либо посредством команды DebugjStart Debugging. В обоих случаях включается режим отладки программы. От образовавшейся точки останова можно либо войти внутрь некоторой функции, нажав на клавишу <РП>, если мы остановились на этой функции, и тем самым проследить, как она пошагово выполняется, либо дальше двигаться по тексту программы шаг за шагом, нажимая клавишу <F10>. При этом будут одновременно выполняться все операторы, находящиеся в той строке, на которую указывает желтая стрелка в красном кружочке. Эта стрелка образуется в поле подшивки, когда после пуска программы происходит останов на заданной точке, а также когда мы начинаем двигаться дальше с помощью клавиши <F10>, выполняя одну строку за другой. В этом случае мы имеем возможность просмотра значений переменных, что очень важно для процесса отладки программы: достаточно навести на имя переменной указатель мыши и немного подождать, как рядом с указателем мыши появится изображение содержимого переменной. Но еще более удобным является показ значений переменных в окне, расположенном в нижней части рабочего стола под текстом программы. Если в строке программы стоит обращение к некоторой функции, то, нажав клавишу <F10>, мы тут же получим ее выполнение. Но если мы хотим, чтобы произошла передача управления в тело функции, на что мы указали чуть выше, то вместо клавиши <F10> следует нажать клавишу <F11>. Сказанное об отладчике- только часть его возможностей. Остальные его функции можно увидеть, воспользовавшись командой Debug меню среды VC++. п-й элемент находится в массиве на (п-1)-м месте int i,j; for(i=0,j=n-l; j<(n-l+m); i++,j++) v[i]=s[j]; v[ij=\0; Эта функция с именем substro ничего не возвращает (тип возвращаемого значения- void), а на свой вход получает строку символов char s[] (вспомним, что строка символов в языке С задается массивом символов), порядковый номер символа, с которого требуется выделить подстроку (int п), количество символов, которое требуется выделить (int m). А выходным параметром будет выделенная подстрока (char v [ ]). Алгоритм очень прост; в цикле участвуют две переменные: i и j. Цикл организован с помощью оператора for. Здесь мы имеем пример того, что в первом (инициализирующем) выражении оператора for может быть более одной переменной (или одного выражения). Такие переменные должны отделяться друг от друга запятой, которую в этом случае называют операция Запятая . Соответственно и в третьем выражении оператора for, где наращиваются переменные цикла, имеется более одной переменной, которые также разделены запятой. Цикл начинается заданием значений переменных цикла: индекс i начинается с нуля, т. к. массив формируется с нулевого элемента. В нашем случае индекс i - это порядковый номер символов, заносимых в массив v [ ]. Переменная j начинается с n-i, т. к. с ее помощью станут извлекаться элементы из массива s[] (т. е. из выделяемой строки). Первый элемент (в данном случае- символ) надо извлечь с места n-i, поскольку пользователь этой функции задает нумерацию в естественном порядке, т. е. считает, что строка начинается с первого, а не с нулевого символа. Тело for состоит всего из одного оператора v[i]=s[j]. В нем происходит пересылка символа из входной строки с места j в выходную строку на место i. И так будет продолжаться до тех пор, пока условие продолжения/окончания цикла не нарушится, пока значение переменной j, меняясь в третьем выражении от цикла к циклу, не станет равным (n-i+m), т. е. не изменится m раз. Это будет означать, что все необходимые символы из s [ ] пересланы в V [ ]. Осталось только выполнить требование языка С в отношении признака конца строки символов: добавить в конец символ \о. Листинг 4.3 void сору(char save[],char line[]) { int i=0; while((save[i]=line[i]) != \0) i++; Эта функция похожа на предыдущую (substr ()), но пересылка символов начинается с нулевого элемента входного массива line[] в нулевой элемент выходного массива save[]. Цикл организован с помощью оператора while. Поскольку на входе имеется строка символов, то она обязательно заканчивается символом \о. В условии окончания цикла имеется выражение: save[i]=line[i]) != \0 Чтобы вычислить это выражение, потребуется, во-первых, переслать сначала i-й символ из входного массива line[] в i-й элемент выходного массива save [ ] и после этого его значение проверить на совпадение с \о. Если совпадения не будет, выполнится тело while: индекс элемента массива возрастет на единицу, после чего станет готовым к тому, чтобы по нему переслать следующий символ из line [ ] в save [ ]. Поскольку эта функция ничего не возвращает, то отсутствует оператор return (). Как только будет передан символ \о, цикл прекратится и программа провалится на закрывающую тело while фигурную скобку. Это означает, что функция завершилась. Головная программа для проверки функций getlineO, substrQ, copyQ Составим теперь головную программу для проверки работы функций getline (), substr (), copy (). Эта программа приведена в листинге 4.4. Функция копирования строки в строку функция сору () показана в листинге 4.3.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |