Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 149
Текст из файла (страница 149)
20.3.14. Размер и емкость Проблемы с памятью решаются в том же ключе, что и у класса «ес(ог (816.3.8); (етр(а(е<с(азз Сй, с(азз Тг = сйаг <га<(з<СЬ>, ей<ля А = апаса(о«<Си» с(ат Ьаяс я(г!пд ( риЫ1с: В... )) размер, емкость и пр.
!подобло 8!б.З 8): яге (уре яге() сопя(; яге (уре так яге() сопя( яге (уре (епд(й () сопя ( гетгп иге (); ) Ьоо( етр(у () сопя( (ге(игп яге () ==О( ) <У число символов 920.3.4) Р л<аксималькал длила < траки Если з2 не находится внутри з, то значение роя равно прок Чтение или запись с таким значением генерирует исключение ои( о(' «аиде (820.3.5). Применить Вайс вийя(«1п» можно следуюшим образом: (уре<(еГ Вая1с зийяичпя<сйаг> Вийя(пад< гойу ('( ) ( я(г(па з = "Ма<у йа(( а 1(и(е 1атЬ" < Яийз(г!пд (з, "1атЬ") = "(ип" ( Яийя(г(па (з, "а Ви(е" ) = "по" ( я(г!ад я2 = "Лое" + вийя(г!пд(з,з.у<и<((' ' ), яппд::проз) ( ) 20.3. Стандартный строковый шаблон Ьаи(с з(ной 709 ио!и! гете (яге туре п, Сй с) и юЫгеяге(яге юуре и) (геяге(п, Сй() ); ) зюга гуре сарасйу () сопя! юЫ гезегие (яге туре гез агд = 0) У как у иесюогс 316.3.8 гу как у уесюоют 3!8.3.8 аИосаюог гуре дею аИосаюог () сопи!; )и Вызов гемгие(геи аюж) генерирует исюпочение йщюй ттог, если гив аю®>так зие() .
Юетрйае<сймз Сй, с!азз Тг, с(аии А> Ьюя!с йоеат<СЪ, Тг>а оретаюог» (Ьтк Вюгеат<СЬ, Тг>и, Ьаяс ыппд<СЬ, Тг,А>и) и гетр!аюе<с!аии Сй, с(аии Тг, сйииА> Ьаяс оягеат<СЬ, Тг>а орегаюог« (Ьазюс оиаеат<СЬ, Тг>и, сопя Ьазюс яппл<СЬ, Тг,А>и) т гетр!аюе<сйюм Сй, сйюзз Тг, сйии А> Ьаяс йоеат<СЬ, Тг>и 8ийпе(Ьаи!с йаеат<СЬ, Тг>и, Ьаз1с заипд<СЬ, Тг,А>и, Сй еою) и юетрйае<сйюя Сй, сйюяю Тг, с)сии А> ьаяс ваеат<сй, тг>и леюдпе(ьаяс йаеат<сй, тг>и, ьаяс заипд<сй, тг,А>и) и Операция «пишет строку в поток оип еат (в21.2.1). Операция» читает слово, ограниченное пробельным символом (ти)юйезрасемепшпа(ед тиос(1) (В3.6, В21.3.1), в строку, расширяя ее по мере необходимости (чтобы уместилось все слово).
Начальные пробельные символы пропускаются, и терминальный пробельный символ также в строку не попадает. Функция леюИпе () читает строчку текста вплоть до символа ео1, расширяя приемную строку по мере необходимости, чтобы вместить весь прочитанный текст (в3.6). Если аргумент ео1 не указывается, в качестве ограничителя используется символ ' ~п', Ограничитель удаляется из потока ввода, но в приемную строку не попадает.
Поскольку приемная строка автоматически расширяется, нет необходимости оставлять ограничитель в потоке или подсчитывать число прочитанных символов так, как это делают функции 8ею ( ) нлн дею11пе ( ) для символьных массивов Щ21.3.4). 20.3.16. Обмен строк как и для векторов (в!6.3.9), для типа июг1п8 функция тиар () может оказаться эффективнее универсального алгоритма: гетр!а!с<с!аиз Сй, с!ат Тг, с!азз А> юЫ зииар (Ьаяс июг(пд<СЬ, Тг,А>и, Ьаиюс июг!пд<СЬ, Тг, А>и) 20.3.15. Операции ввода/вывода Одно из важнейших применений типа июг1аа заключается в использовании строк этого типа для приема ввода, или в качества источника вывода.
Операции ввода/вывода для Ьаяс зи1пя представлены в заголовочном файле <игг(ая> (а не в <1оиггеат>): Глава 20. Строки 20.4. Стандартная библиотека языка С Стандартная библиотека языка С++ унаследовала функции для манипуляции С-строками из стандартной библиотеки языка С. В настояший раздел включены лишь самые полезные из них. Описание не претендует на полноту; за дальнейшей информацией обрашайтесь к справочным руководствам. Имейте ввиду, что разработчики конкретных реализаций часто добавляют в стандартные заголовочные файлы свои нестандартные функции, так что непросто бывает выяснить, какие функции доступны для всех реализаций, а какие нет.
Заголовочные файлы, предоставляюшие возможности стандартной библиотеки языка С, перечислены в 516.1.2. Функции для работы с памятью рассматриваются в 519.4.6, функции ввода/вывода — в 521.8, а математические функции — в В22.3. Функции, имеющие отношение к запуску программ и их завершению, рассматриваются в 53.2 и 59.4.1.1, а средства для работы с неуказанным числом функциональных параметров — в 57.6. Функции для работы с «широкими» строками можно найти в <спсйа«> и <исйаг. й>.
20.4.1. С-строки Функции для манипуляции С-строками представлены в заголовочных файлах <зг«(пя. й' и <сз1пияз< сваг* зггсру (сйаг* р, сопя сйаг* о) ! сйаг* зггсаг (сйаг* р, сот! сйаг* о) 1 сйаг* малеру (сйаг* р, сопЯ сйаг* 4, ги1 п) сйаг* з«глсаг (сйаг* р, сот! сйаг* д, (и1 и) (I копирование из д в р (вкл. терминатор) УУ добавление ~у к р (вкл. терминатор) УУ копирование л сйаг из о в р У(добавление л сйог иэ о в р з(хе 111«!еп (солзг сйаг* р) УУ длина р (без учета терминатора) 1Л1 зисглр(СОИЗ1 сйаг* р, соиЯ сйаг«о); УУсровниваем р и о !п1 ягистр(сот! айаг* р, сопл! сйа«* ~у, ии и) ! ()сравниваем первые п сйаг сйаг' Ягсйг(сйаг* р, (иге) 1 сопл( сйаг* Ягсйг(соил! сйаг* р, !иг С); сйаг* Яггсйг(сйаг* р, 1иг с) 1 сопл! сйаг* згггсйг (сопл! сйаг* р, !п1 с); сйаг* ЯгЯг(сйаг* р, сот! сйаг* о); сопЯ сйаг* Ягз1г(сопз1 сйаг* р, сопЯ сйаг* а) УУ ищем первое с в р УУ ищем последнее с в р У ищем первое д в р сваг* зорйгй (сйаг* р, сопл! сйаг* о) 1 (У ищем первый сйаг из 9 в р сопя сйаг* зггрЬгй (сопЯ сйаг* р, сопЯ сйаг' ((); ясе 111«зри (солт сйаг* р, сопз1 сйаг' д) ! з1гсзрп (соил! сйаг* р, соим сйаг* 4) ! У число сйог в р до любого сйаг не в д ()число сйаг в р до любого сйаг из д Предполагается, что указатель не равен нулю, а массив элементов типа сйа«, на который он указывает, завершается нулем.
Функции, в именах которых присутствует зг«п, в случае недобора символов до числа п, заполняют вакансии нулями, При сравнении одинаковых строк возврашается нуль; отрицательное число возвращается, если первая строка лексикографически предшествует второй, и положительное число в противном случае. 20.4. Стандартная библиотека языка С 711 Естественно, в С нельзя определить функции с одинаковыми именами (перегрузка функций).
Но в С++ они нужны для предоставления безопасных сопл(-версий. Например: го((( (( сопи сйаг* рос, сйаг* рс) У С++ ( *з(гсйг(рсс, 'а' ) = 'Ь' *з(гсйг(рс, 'а') = 'Ь'; ) Функцию з(гсйг() в С++ невозможно использовать для записи в константную строку. В то же время С-программа может проэксплуатировать более слабую проверку типов: сйаг' мгсйг(сопл( сйаг" р, (п( с); )* библиотечная фун-я языка С, а не Сьь *) ) * С, а в С++ не скомпилируется *) )* приводит сопй к поп-сопл() о(( в С, еггог в С++»( ) * о(( на С и С++ *( Всюду, где только возможно, следует использовать тип мг(п» вместо С-строк.
Конечно, С-строки и предназначенные для их обработки стандартные функции библиотеки языка С могут обеспечить высокую эффективность, но даже опытные программисты при работе с ними допускают неочевидные («глупые») ошибки. В то же время С++-программисты неизбежно с ними сталкиваются, просматривая старый С-код. Вот соответствующий типичный пример: гоЫ)" (айаг* р, сйаг* 0) (((р==а) ге(игп; Ууказатели равны Ц (зсгстр (р, а) ==О) () значение строк равны ( Ьп (' = з(г(еп (р); ) У число символов (без учета терминатора) сйаг Ьи((200); з(гсру (Ьи/; р ); Ю копируем р в Ьи(' (включая терминатор) (( опасно: когда-нибудь переполнится.
о' копируем 200 сйаг из р в Ьи( У опасно: когда-нибудь не скопируется терминатор. з( ру(ьи~,р, г00) ( Ввод и вывод С-строк обычно выполняется с помощью функций семейства рг(пб(() (~2Е8). В заголовочных файлах <з((з((Ь. й> и <сз((И(Ь> стандартная библиотека объявляет полезные функции для конвертации строк, представляющих числовые значения, в числа. Например: ((вийе а(о/(сопл( сйаг* р); У преобразует ро в ((вийе ((оиЫе зобо(((сопл( сйаг* р, сйа(** еп(() ( Упреобразует р() в а(оиЫе (зи а(о( (сопл( сйаг* р); Ю преобразует ро в!и( (основание !О) гоИ0(сопл( сйаг* рос, сйаг* рс) ( зп ейг (рос, ' а ' ) = ' Ь '; зп ейг (рс, ' а ' ) = ' Ь '; ) (( еггог: нельзя присвоить соил( сйаг ((о)( но не аккуратно: в рс может не быть 'а' 712 Глава 20.
Строки !опе асо! (сопи слег* р); 77 преобразует р() в !опя (основание 10) !опя игсо! (сопл! сваг* р, сваг** епсс, !пс ь) с у преобразует р() в !опе (основание ь) Пробельные символы в начале строк игнорируются. Если строка не представляет собой числового значения, возвращается нуль. Например„а!о!(чзегеи" ) дает О. Если в вызове лито!(р, еис(, Ь) еис1 не равно нулю, непрочитанная часть строки доступна с помощью *еиИ.
Если Ь==О, то число интерпретируется как целый литерал С++ 54.4.1); например, префикс Ох соответствует шестнадцатеричной форме записи числа, 0 — восьмеричной и т.д. Возвращаемые функциями асо('( ), асо1 ( ) и асо1 ( ) числа не определены тогда, когда они пытаются преобразовать число, не отображаемое с помощью типов возврата этих функций. Если входная строка функции зсгсо1() содержит текстовое представление числа, которое не может быть отображено в типе 1оия !ис, или в вызове функции змос(() строка содержит представление числа, неотобразимого в ФоиЬ1е, то есгио принимает значение ЕЗЫМСЕ, и возвращается очень большое (или очень маленькое) значение. За исключением обработки ошибок, асо((з) эквивалентна всгст((в, 0), асо!(в) эквивалентна 1ис(зсгсо1(з, О, 10) ), и асо1(з) эквивалентна зсгсо1(з, О, 10) .
20.4.2. Классификация символов В заголовочных файлах <ссуре. Ь> и <сссуре> стандартная библиотека объявляет полезные функции для работы с АБСП-символами и другими символьными наборами: тс соиррег (тс с); 7! эквивалент с в верхнем регистре !лс со1он ег (спс с) ! 77 эквивалент с в нижнелс регистре Реализации этих функций обычно используют символ в качестве индекса в таблице символьных атрибутов. Поэтому следующий код (7(('а'<=с ьь с<='г') ( ( ('А'<=с ьь с<='У') ) ( 7! ...