|
Программирование >> Аргументация конструирования
for int 0 ; i<si2eOfloat Array; i + + ) cout << stringArray[i]; В программе объявлен фиксированный массив символов, содержащий, как вы могли заметить, мое имя (какое еще может быть лучше?). Этот массив передается в функцию displayCharArray () вместе с его длиной. Функция displayCharArray () идентична функции displayArray () из нашего предыдущего примера, по в этом варианте вместо целых чисел ею выводятся символы. Программа работает довольно хорошо; но одно неудобство все-таки есть: всякий раз вместе с самим массивом необходимо передавать его длину. Однако можно придумать правило, которое поможет решить нашу проблему. Если бы мы знали, что в конце массива находится специальный кодовый символ, то не потребовалось бы передавать размеры массива. Будем использовать для указания конца массива нулевой символ. Нулевой символ и обычный 0, вводимый с клавиатуры, - разные понятия. Кодом обыкновенного символа 0 является 0x30. Нуль-символ - это символ, каждый бит которого равен 0 (т.е. 0x00). Для того чтобы этот символ б1ло легче отличить от 0, его часто записывают как \0. jS Символ \у является символом, числовое значение которого равно у. Изменим предыдущую программу, используя это правило: yString - выводит на экран массив символов в окне MS DOS ttinclude <stdio.h> #includ2 <iostream.h> прототипов void displayString(char stringArray[]); in (int nArg, char* pszArgs(j) char charMyName[] = {S, t, e , p , h, e, n, 0}; disolayString(charMyName); cout << \n ; return 0; displayString - посимвольно выводит на экран строку void displayString(char stringArray[]) for (int i = 0; StringArray [ i ] != 0; i++) cout StringArray[i]; Массив charMyName объявляется как массив символов с дополнительным нулевым символом (\0) в конце. Программа displayString итеративно проходит по символьному массиву, пока не встретит нуль-символ. Поскольку в функции displayString () больше нет необходимости передавать куда-либо длину символьного массива, использовать ее проще, чем displayCharArray (). К тому же () работает даже тогда, когда размер строки символов во время компиляции пеизвестеп. А это случается пампого чаше, чем вы думаете (смотрите главу 6, Создание функций ). Включать нулевой символ в символьные массивы очень удобно, и в языке C++ он используется повсеместно. Для таких массивов даже придумали специальное имя. Строка - это символьный массив с завершающим нулевым символом. Инициализировать строку в C++ можно с использованием двойных кавычек. Этот способ более удобен, чем тот, в котором используются одинарные кавычки для каждого символа. Строки 8 и 9 из пред1дущего примера можно записать более компактно: cha ате[] = Stephen ; Соглашение об использовании имен для обозначения строк с завершающим нулем использует префикс sz. Такая запись является соглашением и не более. Строка Stephen содержит восемь, а не семь символов - не забывайте о нулевом символе! Программистам часто приходится работать со строками. В C++ для этого можно использовать стапдартпые библиотечные функции обработки строк, что сушествснно облегчает жизнь. Чтобы понять, как они работают, попытаемся самостоятельно написать что-то подобное. Написание функции, соединяющей две строки Вы можете написать собственный вариант обрабатывающей строки функции. Для этого нужно использовать семантику массива и добавить проверку наличия в конце массива нулевого символа. Рассмотрим следующий пример: Concatenate - объединение двух строк, которые разделяются символом - tinclude <stdio.h> tinclude <iostreain.h> Включаем файл, необходимый для функций работы со строками itinclude <string.h> прототипов void concatString(char szTarget[], char szSourcel]); int rnain(int nArg, char* pS2Args[]) i считываем первую строку... char szStringl [256]; cout Введите строку #1: ; cin.getline (szStringl, 128) ; теперь вторую.. . char szString2[128]; cout << Введите строку #2: ; cin.getline(saString2, 128); ...присоединим - к первой строке... concatString{azStringl, - ); strcat(szStringl, - ) ; теперь добавим вторую строку... concatStringfszStringl, szString2) ; strcat(szStringl, szString2); . , ,и выведем результат на экран cout << \n << szStringl << \n ; return 0; String ~ присоединяет строку szSource к концу строки szTarget void coricatString(char szTarget [], char szSource ( / / находим конец первой строки int targetlndex = 0; whiJe (szTarget[targetlndex]) targetindsxt+; присоединяем вторую строку к концу первой int. sourcelndex = 0 ; while (szSource [sourcelndex] ) { szTarget[targetlndex] = szSource[sourcelndex]; targetlndex++; sourceIndex+; вписываем в конец ноль-символ szTarget[targetlndex] = \0 ; Функция main считывает две строки, используя функцию getline{). (При использовании варианта cin >> szSt г ing информация считывается до первого пробела, в нашем же случае строка считы1вается до символа начала новой строки.) Функция main () объединяет две строки, используя concatString {) перед в1во-дом результатов. Функция concatString () присоединяет второй армент (szSource) к концу первого (szTarget). Эта задзча решается в несколько этапов. В первом цикле проводится поиск конца строки szTarget. Функция concatString; итеративно проходит по строке szTarget, пока значение targetlndex не станет равн1м индексу нулевого символа в конце строки. В этот момент переменная targetlndex указывает на последний символ в строке szTarget. Цик alue!=0) можно записать корочек ile (value), так как рассматриваемое условие принимает значение false, если value равно 0, и true в прочих случаях.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |