Искусство программирования на Си (984073), страница 72
Текст из файла (страница 72)
1ЯРПТ Тург СЕХ'" ДАИК 1"'С'1ОЛ" АУ Ц Д Я У Ц () приведенного ниже примера видно „„ данные пред '5125«*20'> освободвть память, выделенаую под указатель <вв> * функлвей Овр5Сгхпд(). ставлены в закодированном виде. Знание формата данТег <ТЕХТАВЕА> «/ ных позволяет гораздо лег<с производить синтаксичес- <1ВРОТ Ттрби"яовюсг"> сЬаг «Опрбег(вд(солне сЬаг 'я) кий аназиз ожидаемых данных.
ста, в которое пользователь может ввести большой объем </роав> ( </Рдг> сваг «Опр = ЯОЬЬ< СОЫТЕЫТ ТТРВ=арр11сае1оп/х-ммы-гохм-пг1епсопеп данных. Этот тип отличается от типа ТЕХТ тем, что с </вову> хт(а != ВПЬЬ) 6АТЕТТАУ 1МТЕ((РАСЕ помошью атрибутов СОЧВ и КО%В можно установить </втыь> ( количество столбцов и строк, которые будут отобра- Ппр = юа11ос(яег1еп(я) + 1); Переменная САТЕ%АТ 1Р(ТЕХАСЕ указывает ве сию В приведенном примере задано простое поле ввода хт(впр .= ВОЬЬ) а р ю жаться на экране. текста, в которое пользователь может ввести имя функ- ( СО1, кот<>рую поллерживает <Х<сЬ-сервер. Формат этой ИП- 2(опа иитс" ииие те ~ати ест еро паси Написоиие Г61 прилоисеиии па Г 1 $ Часть ! и Глава 23 браузсра. переменная имеет слсдуюший формат: про- ипЕМОТЕ А00пп 5ЕВЧЕй МАМЕ какого-то отдельного браузера, а особенностью самого граммнос обеспечение/библиотека версии/версия.
Зна- НТТР-протокола. Более того, сушествуст ограничение Если требуется !Р-адрес браузера, который вызывает Переменная ЯЕКУЕК ХАМЕ может содержать либо чсния переменной для некоторых часто используемых Р У вЂ” Р Р У Р ° Р ' Р— и на количество символов в (/КЕ-адресе. Это ограничение браузсров приведены ниже. нашу программу. то его можно на!ии в перемен~ой действительное имя, либо доменное имя-пссвдонилн накладывается уже самим используемым браузером. Для Для (пгегпе( Ехр!огсг 3.02 значение переменной КЕМОТЕ АРОК.
либо 1Р-адрес сервера. Значение этой переменной ис- одних браузеров оно составляет 8192 бнйта, лля других— НТТР ()БЕК АОЕ1ЧТ равно: НЕМОТЕ Лццит192. 168.10.29 ользуе я лля указан я относительных СКС- сылок в„,о 255 байтов но в, ным является то, такое ог — — Например, слелУюшее значение ласт хост-имЯ сервера: „„ч ни с,ш — НЕМОТЕ НО5Т З.эг; цриаеа а; Лис Изадоиа 99! ВЕРВЕН Иаивте91.аод.сот К счастью, есть превосходная альтернатива. УстаноДля !Е4: Эта переменная содержит хост-имя компьютера, козо- 5ЕЙЧЕВ РОЕТ вив значение атрибута МЕТНО(У равным РОЯТ, мож- рый делает запрос Если правильное доменное имя нс- но указать %сЬ- серверу передавать данные СО1-прилонттв овен доент=моа111а/4 ° с (еотнасзьза' мате лоступно клиенту, функция йе(епх() возврашаст значс- Болыцинство НТТР-серверов используют порт 90, ио жснию через стандартный входной поток данных.
нис 1Ч(Л.(.. это ни в коей мере не является требованием. довольно КРоме того, ~сЬ-сервер передаст СО1-езриложснию в Для 1чемсаре 4.04: часто сервсрылибопосоображениям безопасности,либо переменной СО(ЧТЕ(ЧТ (Е(ЧСТН точное количество НЕМОТЕ НОВТиага4б.ии1 пах вследствие необхолнмости подлержки нескольких серве байтов, которос должно быть пРинЯто пРиложенисм. нттв цвви давит=моа111а/4.О4 С-НЕ (Игаээс 1! ВЕМОТЕ ПЧОЕИТ ров на одном компьютере используют и другис порты. Такой метод перслачи не накладывает огРаничсний на РАТН !ИЮ Переменная ЧЕКРЕК РОКТ сообшает СС1-приди- объел' передаваемых данных.
И еше одним пРсимУшс- Это поле пока ываст илснтификатор пользователя Оно жению номер п рта к т рый использ в з я я, ством этого метода является то, что мстодРОБТнс отоКлиент (как правило. браузср) имеет возможность че- доступно нс весела, а в зависимости от того, поилсржгь нов ния соединения с ним бражаст с ро у рюа в адресной строке браузсра как рсз переменную РАТН 1(ЧЕО передавать лополнитсль- наст ли компьютер клиента НУЕ(ЧТ КГС (Ксйцсвм (ог зто делает метод ОЕТ.
Тем ис менее, нс следует считать гетпгп Впутег и†/(оноыатши~не тематачегхиераздегн т Часть Н1 Глзвз 2Э 1 Листинг 23/Е Функция ((еас(С61()а(а, которая е1ве А5С(1. Например, %21, т.с. Ох21 в шестнадцатиричном /* Самвел долвен бить в строке Нех, осуществляет считывание входных данных С61- ( виде, соответствует десятичном> значению 33, что со- если его там вет, значит, в данаях есть гт(НОЬЬ == 1детв(нп((ег, Бгзе оввбка. программы с входного потока.
— — втбгп » отвстствуст символу "!". сбаг *НеабСО1паса( 1пт *Еггог) ( 11 «ЯатсЬ = втгснг(Н , *в » .= ЯПЬЬ) ( *Еггог = СО1 яп Оьтл; ПРИМЕЧАНИЕ сьаг *Вп((ег 1гее(Вп((ег » Если вы разработчик универсальных программ, то, назер- /* теперь мокно вмчнслвть старлей сЬаг *Недпевтнетьоб = япЬЬ; Вп((ег = НОЬЬ; ное, уже начинааге проявлять нетерпение. А как насчет полубайт эквивалента свмвопа в кодировке сЬаг *Соптептоепдтн = КОЬЬ; ) расширенного двоична-десятичного кода и других упоря- АБС11. сЬаг Сптпата = ЯОЬЬ; доченньж кодовьж таблиц? А что произошло с переноси- */ ) мым программированием) Просто НТТР использует А5СН, вась( = (ппвгдпеб (пт)(натан - Нек» вгзе Г Бззе = О и другого варианта просто нег.
А5СБ фактически явля- ется алфавитом Хг/еб-сети. /* А теперь то ке самое дпя младвего еЕггог = СО1 БОССЕББ; ( полубайта. е = со1 пееяоик нетноо; Приведенное описание может показаться немного */ Недпеаькесвоб = детепч("Ннппннт ИнтНОП ); сложным. Тут уместно вспомнить пословицу, которая В++1 г((ЯПЬЬ == Недоевснетьоб) зе «кассь = вьгсьг(нех, 'в» 1= ( гласит, по л)чшс один раз увидеть, чем сто раз услы- ЯОЬЬ) ° Еггог = Спт ЯПЬЬ НЕП НетнОо; шать. Поэтому давайте лучше посмотрилг на исхолный ) код привслснный в листингс 23 2 /" Убрать старввй полубайт. */ Авсгг «= Сн г((0 == 'Еггог) Листинг 23.2.
С61НехуоАБсй — преобразование Авсгг )а (ппвгдпеб (пт) Ненасение СО/ Дилачнитюиные тематические раз)ееы 3 Часть )и Как и предыдущий, этот код можно найти на >Чеб- Ничего сложного, это довольно простой односвязсайтс издательства "ДиаСофт" в файле сйьс, и вам не ный список. Мы продвигаемся по строке запроса, развв11е(в == Еггог ьь Р>е>О )= НО ) вв11е О == Еггог ЬЬ Р>е1О != НОЬЬ! придется писать его само>!у. бивая ес символами амперсанда, декодируем ее, разде- * преобразовать закодвроваввме свмволм Если вы д>маете, что этой функции передается вся ляя переменныс и значения (при этом в качестве зу(СО1вехтовзс(1(Р1е1О) != В) строка запроса, то вы ошибаетесь. Вспомните, что дан- разделителя переменной и значения используется сим- ( ные представлены в виде пар переменная=э!соление, раз- вол "=") К сожалению, мы нс знаем, какой обьем па- еггог = 1; деленных символом амперсанда.
Если амперсанд явля- мяти выделить под значение и под перемени>ю. Пср- е1зе ется частью данных пользователя (и преобразуется вый способ, позволяющий определить это, — двигаться < браузсром в шестнадцатиричный вид), то преобразова- по строке до первого символа "=", затем вернуться на /* устававлвааем звачевая по умолчаввв. Нм ве макея вспользовать вевзек, поскольку в ние всей строки в формат АБСП было бы неправильным начало строки и произвести само копирование данных.
ставдарте ВН51 ае оговорено, что а двовчвом ваде НОЬЬ во всех разрядах содерквт ауле. решением. Имеет смысл сначала перед каждой парой Олнако это нс очень эффективно. и/ лереченная=значение поставить маркеры, а затем декоди- Оказывастся, это делать не обязательно. Достаточ- Спгг1кев >вехе — НОЬЬ! ровать кюкдую пару. но просто поместить переменную ЪвпаЫе и значение в Кроме того, необходимо подумать о хранении перс- одно место памяти (на место переменной). Далее пере- /* Для сохраввоств скопировать даввве поля '! менных и их значений.
Первое, что прихолит в голову, — мсщасм указатель по символам значения Ъса)пе до тел Спгг1Сев->Чаг1авге = Опрзгг1пя(Р)е1с))! это список. Поэтому нашей первой задачей будет фор- пор,пока нс встретится символ "=", устанавливаем зна- ку(НОЬЬ == Согг1сев->Чагзавье) мированис структуры данных, которую можно органи- ченис, на которос >казываст указатель, равным н>лю ( Еггог = 2! зовать в виде связанного списка. Вот часп файла сеьй: (>О) и переводим указатель на слсл>ющ>ю позицию. Пока мы помним, что Ча)пе указывает на мсстоположс- е1ае Суреаеу асгосе Спх Ьгат ) /» О случае оаибки удалить весь список */ д1(яггог 1= О) ( Да»танте»»н те те ната»пенне ра>)ели Написан»» СС1-при именин на С В 1 Часть 1и Глава 23 Листинг 23.4.
Функция Арр — ориентированный на приложение код для отображения прототипов функций стандартной библиотеки АЬ)5) С. чада Лрр(СС1 Ьтзт »Ьдэг) ССЬОиас уьдис(ССтьдиг]1 ( сЬаг »Ргокп = ИОЬЬ; СС1ьтиг = ИОЬЬ1 дпс СеьадпЧЧегидоп1пто = 01 сйаг »Чпгпдоп1пто "С ОЬ1еапьеб СС1 Опао ч1.05"1 геспгп СС1птит) сЬаг »Ясгдрсиаме = Оекепч("ЯСИ1РТ Ийия'); ) /» им окидаим, что а списке будет только одна эпемаат, поэтому давайте его используем. */ Код, приисдснный а лнстннтс 23.3, строит связан- приложснис будет нс только выводить на экран про~оный список, и котором каждый узел прсдстапляст олну тип указанной функции или номср версии, но и новую дт(эггсмр(ьдак->Ча1пе, *чегпдоп ] == О] псрсмснную и соотистстяуюшсс сй значение Признаком форму, с помошью которой пользователь сможет про( конца списка яплястся значение М)Е).. В таком списке должять поиск по библиотеке функций С.
Спьсдп Чигь(оп1п(о = 1; 0 могут содержатся псрсмснныс с одинаковыми именами, Чтобы слслать процссс программирования для нашеслсдопатсльно, у нас нс будет проблем, если лля радио- то читателя как можно более приятным, мы позаботи- ргдпкт("<ЯТИЬ>1п ); кнопок или яыпадаюших списков будет установлено лись, чтобы исс функции а приложении, за исключсни- ргдпду( <ВДЬО>тп ) М()ЕТ)РЕЕ см только одной функции, специфичной для данного ргдпгт( <т)ТЬВ>тп )1 'ч ."т-" " " -" "' > ." > ." .
.р -еь; > ,..., .;, ; , .„...,,...,....,..., „., „ ..„,,„ ...,, , „,. „ „ . .. , - , дт(СеьсдпЧЧпга(оп1пто ) тиннтинмаание теми ни«ее< и разде ~и Часть )В Нине<ание СС!-ирииииеений ни С 1 Глава 73 рггпст(" <Свлтвв>(п ); рггпьт( ОпХпомп СО1 Еггог )п рг пя((' <РОВт 5)ХЕ=(>)п"); ЬгеаХ; ргтпят(" Нехя яеагсва Хп'); ) рг)пхт(* <ВН>)п<ВВ>)п ); рггпст( Р1еаяе Гуре гп СЬе паве /* Нв ае молем предоплата, поэтому аллодам. «/ "от ГЬе Хппсяаоп(п')) геяпгп ЕХ1Т РА1ЬОНЕ; Рг1пст!' чЬове ргототуре уоп* ) югяЬ Со яее.1п'); РГ(ПГХ(" </РОВТ>ХП")1 Ьгэя СО1сгеаяеЬ>вт(ооруОХЯпегуясггпр), рг1пст(' <ВН><ВН>1п"); /' Сработало это алв ает, у аас болаве ает аеобходимоста в СоруОХопегувсгьпд, поэтому ргтпсх( <1лрот тхРе=)"ьехг1* ВАне= освоболдаем ее.