Г. Шилдт - Полный справочник по C++ (1109478), страница 28
Текст из файла (страница 28)
Стандартная библиотечная функция деев() представляет собой классический пример передачи массива в качестве параметра. Рассмотрим се аналог кдеев(), хотя реальная функция деев () намного сложнее. /* Упрошенный вариант стандартной библиотечной функции деев(). */ спат *хдетв(сЬаг *я) ( сЬат сЬ, *р> 1пг р = я> /* Функция хдетв() возвращает указатель на строку в */ тот(Г=О> с<80> ++с)( сЬ = детсЬат()> яи1тсЬ (сЫ ( саяе '~п'> в[с) = '>О'> /* Признак конца строки */ тегптп рг саве '>Ь'> 1г(гьо) Ьгеа)г> г)егаи1т> я[с) = сЬ; ) ) я[79) = ''>О' > гетптп р> ) Аргументом функции хдеев() должен быть указатель на символьную переменную.
Разумеется, в качестве аргумента ьголо>о задать имя символьного массива, которое по определению является указателем типа сЬат *. Сначала функция хдеев() выполняет цикл тот, счетчик которого изменяется с 0 до 79. Зто предотвращает ввод с клавиатуры более длинной строки. Если пользователь попытается ввести больше 80 символов, функция выполнит оператор теептп.
[В реальной функции деев() этого ограничения Часть [. Основы языка С++: подмножество С нот.) Поскольку в языкс СгС+э нот встроснной провсрки выхода индекса массива за прслслы допусзимого диапазона, слслуст убедиться, что любой массив, псрславаемый функции жяевв(), может вмсспзть ло )(О символов. Каждый символ, ввсденный с клавиатуры, помсшастся в строку. При ~пжтпин клавиши <влскврлсн> счстчик с уменьшается на 1, удаляя из массива последний символ. При ~ взжатии клавиши <кнтвв> в конон строки помещается нулсвой байт.
Поскольку функция ндека() моднфицнруст фактичсский аргумснт, после выхода из нсс массив и булат содержать символы, ввсдснныс пользоватслсм. 1 Аргументы функции ваа(): агдс и агяч Иногда бываст удобно вводить ланныс, указывая их в команлной строке при запуске программы. Для этого обычно используются аргумснты функции ваьп(). Аргумснтами комаплнои строки называ|отся дашзыс, указанныс в командной строке операционной системы вслсл за имсцсм программы.
Например, при компиляции программы часто используют командную строку сс имл програлыгы Злссь парамстр цил программы является аргумснтом командной строки, который задаст имя компилируемой программы. Для получспия аргументов командной строки прсдназначсны вот)юснныс аргументы функции гаахп(): акпзг и нкпс. Цслочислснный параметр ак(гс содержит количество аргументов команлнои строки. Его значение нс можст быть мсньшс !, поскольку имя программы считастся псрвым аргументом, Параметр акдт представляет собой указатсль на массив символьных указатслсй. Каждый элсмснт этого массива ссыластся на аргумснт командной строки. Всс аргумснты команлной строки являются строками — ввслснныс числа должны конвертироваться в соотвстствуюшсе вцутрсннсс прслставление. Рассмотрим простую программу, которая выводит на экран строку "Привст," и ваше имя, введенное в командной строке.
Мупс1иде <зало.ц> ((1пс1ос)е <зМ11Ь. Ь> 1пь гяа1п(ьпь атдс, сцат "агпч() ) ( 1Г(атдс(=-2) ргупсу("вы запыли указать свое иия. (п")г екьс (1); ) > рх1пвй("Привет, Ъз!", ассу(1)); гесьсп О; ) Если в командной строке набрать имя программы и указать свое имя, например, пажа иван, то программа вывслст на экран строку "Привет, Иван!".
Во многих опсрационных системах каждый аргумент командной строки должон отделяться пробелом или знаком табуляции. Запятыс, точки с запятой и другие знаки пунктуации разлелитслями нс считаются. Рассмотрим пример. $ тип ярос, гцп Эта командная строка состоит из трех строк. А командная строка $ НехЬ, К1сх, рхег) содержит только одну строку, поскольку запятая раздслителсм нс является. Глава 6.
Функции В некоторых операционных системах строку с пробелами можно заключать в двойныс кавычки. В этом случае она считается отдельным аргументом. Прежле чем перелавать параметры через командную строку, прочитайте документацию, сопровождающую вашу операционную систему.
Аргумент ахдч необхолимо объявлять самому. Чаще всего применяется слелуюший способ. Вя с).аг *агдч[]; Пустые квадратные скобки означают, что массив имеет неопределенную длину. ]]Оступ к отдельным элементам массива атдч осущесцшяется с помощью индексации. Например, элемент акдч[0] ссылается на первую строку, которая всегла является именем программы, элемент акдч[1] ссылается на первый аргумент и т.д. Рассмотрим программу совпейонп, в которой используются аргументы командной строки. Счетчик цикла в этой программе уменьшаемся с начального значения, заданного аргументом командной сроки, до О, Обратите внимание на то, что первый аргумент преобразуется в целое число с помощью стандартной функции ато1[).
Если вторым аргументом является строка "Йзр]ау", значение счетчика выволится на экран. /* Программа соипсйомп. */ ««пс1ийе <яей«о.Ь> «зпс1ийе <яей1«Ь.Ь> ««пс1ийе <стуре.Ь> «1ьс1ийе <ясг«пд.Ь> зпе иатп(]пе агдс, сиаг *агдч[]) ( дпе й«вр, сопле; «й(агдс<2) ( рг«пе«("Введите начальное значение счетчикМп"); рг1пе«("в командной строке.
Попробуйте еще.1п"); ех«е(1); ) 1«(агдс==з Ьа !яегсир(агдч[2], "й1вр1ау")) й«яр = 1; е1яе йхяр = О; гог(попас=асо1(агдч[1]); сопля; --соппс) 1«(й«вр) ргьпе«( Вап , сопля); рпесиат('1а'); /* Сигнал */ рг«псг("Гстсвс"): гетигп О) Если командная строка не содержит аргументов, на экран выдается сооб)ление об ошибке. Программа, ожидающая ввода аргументов нз командной строки, должна анализировать их и даваясь пользователю соответствующие инструкции. Чтобы вылепить отдельный символ из аргумента командной строки, нсобхолимо использовать индекс массива акдч.
Следующая программа выводит на экран все свои аргументы посимвольно. ««пс1пйе <вейде.Ь> Часть 1. Основы языка С++) подмножество С тпс п1атг1 ( тпс агдс, спас *агдч [ ) ) ( ъпс с, гог(с=.о; с<а"дс; = с; жбана(агдч[С)[т)) росс)заг(агдч[С)[(1) ргз.псХ("тп'); ) геьсгп 0; Учтитс, что псрвый иплскс прслоставляст доступ к строке, а второй — к отдельному символу. Обычно аргумспты ахдс и ахд1г используются для псрслачи пачальпых параметров программы.
тсорстичсски можно указгавать ло 327б7 аргумс~(тов. олиако в большинстве операциош(ых систем это количество пампого мспьшс. Как правило, аргумспты комаилпои строки задают имя фаила или какую-либо опцию. Примсцсиис командных аргументов придаст программе профсссиоиальиый вид и позволяет примспять пакстпыс файлы (Ьагс)( В)са). Если программа ис используст аргумсптов, указывасмых в командной строкс, как правило, функция гхадп() яшю объявлясзся без парамстров.
В программах иа языке С для этого достаточ(ю просто указать в списке паралзетров клю (овос слово чоап. Однако в языке Сч-ь список парал(стров мож~(о вообще оставить пустым. Использоваиис ключсвого слова тоъгт для объявлспия пус~ого списка парамстров в языке С++ допускастся, по пс рскомсддустся. Несмотря па то что имена акдс и акдзг являются традициоппыми, аргумситы функции жа).п() можно иазывагь как угодно. Кроме того, компиляторы могут подлсрживать расширсцпыи список аргумс~ггов функции вахи(). Информацию об этом следует искать в докумсптации.
~~- Оператор геЬгп Оператор хесихп ужс рассмазриаался в главс 3. Как извсспю, оп используется в двух ситуациях. Во-псрвых, оц вызываст цсмедлспиый выход из фуикции. Иначе говоря, программа псрсдаст управлсиис вызываюшсму модулю. Во-вторых, с помошью оператора кеспхп осу(цесталястся возврат зиачспия, вычислсииого фупкцисй. Рассмотрим, как это происходит. Возврат управления из функции Сушсствуст лва способа прскратить выполпспие фуикции и вернуть управлспис вызываюшсму модул(о. В первом случас функция полностью выполняст свои операторы, и управление досп(гает закрываюшсй фигурной скобки ). [Разумсстся, сама фигурная скобка ис порожласт пикакого объектного кода, однако сс можно так гпперпрстировать.) Напримср, функция рк кеиахвеО в слсдуюшсй программе выволит иа экран строку "Я люблю С++" в обратном порядке, а загсы возвращает упранлсиис главному модулю.