Как в std::string сделать Lower или Upper?
Объясните пожалуйста чайнику, как в std::string быстрее всего сделать Lower или Upper?(перевести символы в нижний или верхний регистр).
string s;
.
transform(s.begin(), s.end(), s.begin(), toupper);
это выражение разворачивается в цикл вызовов функции, те если строка длинная не будет ли быстрее:
char buff[4096];
strcpy(buff,res.c_str());
СharLower(buff);
res=buff;
CharLower((char*)res.c_str()); //просьба не бить ногами:)
loha
>CharLower((char*)res.c_str()); //просьба не бить ногами:)
Ладно живи :))) я тоже так делал.
Az
+1
loha
Andrey
Cool Ace
-1
И получаем неопределенное поведение которое на некоторых реализациях STL может привести к конкретным глюкам.
WolfHound
Ради любопытства — на каких конкретных реализациях?
Например существуют реализации STL в которых реализована стратагия copy-on-write те строка копируется только когда ее пытаются менять
ЗЫ Повезло вам что RSDN временно не работает. иначе никто бы вам про эти грабли не расказал.
Семен
>О, WH is back!
Когда админы RSDN поднимут пропаду опять. У меня сейчас на него времени не хватает болие 10К посетителей в день. и модерирую 4 форума. хорошо что хоть не один. Да еще и работать приходится. ибо кушать хочется.
>Ради любопытства — на каких конкретных реализациях?
Если не не изменяет память такие грабли есть в STL которая идет с VC++6 и с какимито версиями GCC
Короче реалиций STL как собак не резаных на какойнибудь да вылезет.
Хотя конечно
Правильно работающая программа — просто частный случай Undefined Behavior ^_^
(С)_Winnie
Такчто может и повезти :))
Хотя я бы не стал экономить на таких вещах.
Как кто-то сказал «Хороший программист это не тот кторый знает как что-то сделать, а тот который знает чего делать ненадо»
WolfHound
>И получаем неопределенное поведение которое на некоторых реализациях STL может привести к конкретным глюкам.
Фишка в том, что таких реализаций практически нет. Почитай http://www.gamedev.ru/forum/?group=0&topic=13574&page=2.
Тем не менее, за такой код:
CharLower((char*)res.c_str());
ИМХО следует бить ногами максимально сильно. К тому же, нет уверенности, что API-функция CharLower() будет работать быстрее,
чем цикл с transform().
эээ. а чем std::tolower / std::toupper не устраивает? там даже разные «языки» поддерживаются
Перевод символов в верхний регистр
В следующей программе введенная пользователем строчка переводится в верхний регистр, то есть маленькие буквы становятся заглавными. Заглавные буквы и символы, не являющиеся латинскими буквами не меняются.
Обратите внимание на то, что с символами (переменными типа char ) можно оперировать как с числами. В частности ‘Z’ -‘A’ есть число, равное разности ASCII кодов символов ‘A’ и ‘Z’, то есть 26 число букв в латинском алфавите. Символы можно также сравнивать друг с другом при этом сравнива.тся соответствующие им ASCII коды.
При решении практических задач функцию перевода строчки в верхний регистр писать самому не надо. Это стандартная функция, которая есть в библиотеках различных языков программирования. В большинство скриптовых языках она просто встроена. В частности, в стандартной библиотеке string реализованы функции strlwr и strupr , которые переводят строчки в нижний и в верхний регистр. Соответствующие функции для преобразования одного символа tolower и toupper определены в библиотеке ctype .
Ниже приведена программа, которая использует функцию tolower библиотеки ctype и переводит строчку в нижний регистр.
mb_strtolower — Приведение строки к нижнему регистру
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
mb_strtolower — Приведение строки к нижнему регистру
Описание
Возвращает строку str , буквенные символы в которой приведены к нижнему регистру.
Список параметров
Параметр encoding представляет собой символьную кодировку. Если он опущен, вместо него будет использовано значение внутренней кодировки.
Возвращаемые значения
str , буквы в которой приведены к нижнему регистру.
Юникод
За дополнительной информацией о свойствах Юникода обращайтесь в » http://www.unicode.org/unicode/reports/tr21/.
В отличие от strtolower() , то что символ является буквой определяется на основании свойств символа Юникода. Таким образом на поведение функции не влияют региональные настройки системы, а также функция может преобразовывать символы, имеющие буквенные особенности, такие как А-умляут (Ä).
Примеры
Пример #1 Пример использования mb_strtolower()
Пример #2 Пример использования mb_strtolower() с нелатинскими буквами
Смотрите также
- mb_strtoupper() — Приведение строки к верхнему регистру
- mb_convert_case() — Производит смену регистра символов в строке
- strtolower() — Преобразует строку в нижний регистр
Strlwr привести к нижнему регистру
Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или похожей функции совсем нету?
Оглавление |
|
Сообщения по теме | [Сортировка по времени | RSS] |
1. «Чем заменили strlwr?» |
Сообщение от phpcoder (??) on 23-Июн-08, 14:11 |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
2. «Чем заменили strlwr?» |
Сообщение от zkrvova (ok) on 23-Июн-08, 14:21 |
Она переводит все семволы строки в нижний регистр. В гугле искал. Это сишная функция. |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
3. «Чем заменили strlwr?» |
Сообщение от phpcoder (??) on 23-Июн-08, 14:28 |
Стандартной нет. Придётся написать свою, благо это очень легко: for (int i = 0; i >for (char *p = str; *p; p++) *p = tolower(*p); |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
6. «?» |
Сообщение от arturpub (ok) on 24-Июн-08, 09:44 |
в 3 посте вроде |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
9. «?» |
Сообщение от Andrey Mitrofanov on 24-Июн-08, 13:23 |
Ступил. Не прочитал неотквоченное. |*) |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
8. «Чем заменили strlwr?» |
Сообщение от vic (??) on 24-Июн-08, 12:37 |
Код был приведен для примера, ясень пень юзать strlen() в условии не гуд. Смысл примера был в другом. А если уж хочется вопросов на засыпку, то: |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
10. «Чем заменили strlwr?» |
Сообщение от arturpub (ok) on 24-Июн-08, 14:53 |
|
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
11 . «Чем заменили strlwr?» |
Сообщение от vic (??) on 24-Июн-08, 16:54 |
гугл это еще не posix. >кстати сказать функции из string.h никогда Я продемонстрировал ненужность указания недочетов в примере, это всего лишь пример. На вашем же примере показав как минимум три недочета в коде. Проверять или не проверять на null в вашем примере тоже самое что писать в условии цикла strlen(), т.к. и то, и то плохой стиль. Задача программиста писать переносимый код, а не код который завтра же придется править только потому что у клиента другая кодировка. В случае введения поддержки utf-8 такой код править — полный абзац (по опыту), особенно для интернационального приложения. >tolower вернул int, что и должен был. (??) Да, именно так, и принимает int, а данные char. Функция небезопасная. Хотя в данном примере порча строки при некорректной локали это максимум что может произойти. Но все же были случаи когда это порождало серьезные баги. |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
12 . «Чем заменили strlwr?» |
Сообщение от arturpub (ok) on 24-Июн-08, 20:06 |
если у клиента другая кодировка, то (раз уж мы работаем с содержимым строк как с символами, а не как с байтами туда-обратно) при «не той» кодировке «перестанет» работать и весь clib, так ? для выбора другой локали есть setlocale(), utf-8 же clib’ом поддерживается только через mbs->wcs, и функции работы с wcs имеют одноименный префикс. где уж это мой недочет ? если программист _действительно_ планирует работу с толстыми буквами, то ему нужно подумать об этом заранее, а не ругать имеющиеся средства. то есть конвертим utf8 в wcs и применяем wcslwr/towlower. с ucs4 конечно на clib’е тяжелее. насчет локали. если setlocale() вызвана с верным аргументом, то для любой 8-битной кодировки tolower() вернет правильное значение, даже для utf8 (т.к. utf8 в плане однобайтных символов идентична 7-bit ascii, и ни одна русская буква не попортится). и разумеется *str*lwr не обратит неаскёвую часть. избитый нами int tolower(int) принимает в нашем контексте всегда не более чем char; в мануале сказано, что если «c is not an unsigned char value, or EOF, the behaviour of these functions is undefined.», иначе оно возвращает int, который без потерь кастится в char. тут опять не вижу проблем в применении. |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
13 . «Чем заменили strlwr?» |
Сообщение от vic (??) on 26-Июн-08, 14:57 |
ОК нет перстанет работать контекст-зависимая часть функций, т.к. строка (char*) остается нуль-терминированной (до тех пор пока туда не начнут пихать совсем черт знает что), т.е. всякие strcmp, strcpy, работать будут. > для выбора другой локали есть setlocale(), utf-8 же clib’ом поддерживается только через mbs->wcs, и функции работы с wcs имеют одноименный префикс. где уж это мой недочет ? если программист _действительно_ планирует работу с толстыми буквами, то ему нужно подумать об этом заранее, а не ругать имеющиеся средства. то есть конвертим utf8 в wcs и применяем wcslwr/towlower. с ucs4 конечно на clib’е тяжелее. Верно, и думать надо т.к. сейчас основной кодировкой становится utf-8, а с strlwr-ориентированными решениями будет беда. > Вот-вот для utf-8 функция например вообще не работает, преобразование будет не выполнено. А это явно не то что хотелось бы. > в данном конкретном случае да. |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
14 . «Чем заменили strlwr?» |
Сообщение от arturpub (ok) on 27-Июн-08, 04:30 |
мы явно погнули разные линии |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
7. «Чем заменили strlwr?» |
Сообщение от zkrvova (ok) on 24-Июн-08, 10:54 |
mb_strtolower(PHP 4 >= 4.3.0, PHP 5, PHP 7) mb_strtolower — Приведение строки к нижнему регистру ОписаниеВозвращает строку str , буквенные символы в которой приведены к нижнему регистру. Список параметровПараметр encoding представляет собой символьную кодировку. Если он опущен, вместо него будет использовано значение внутренней кодировки. Возвращаемые значенияstr , буквы в которой приведены к нижнему регистру. ЮникодЗа дополнительной информацией о свойствах Юникода обращайтесь в » http://www.unicode.org/unicode/reports/tr21/. В отличие от strtolower() , то что символ является буквой определяется на основании свойств символа Юникода. Таким образом на поведение функции не влияют региональные настройки системы, а также функция может преобразовывать символы, имеющие буквенные особенности, такие как А-умляут (Ä). ПримерыПример #1 Пример использования mb_strtolower() Пример #2 Пример использования mb_strtolower() с нелатинскими буквами Смотрите также
User Contributed Notes 6 notesNote that mb_strtolower() is very SLOW, if you have a database connection, you may want to use it to convert your strings to lower case. Even latin1/9 (iso-8859-1/15) and other encodings are possible. Have a look at my simple benchmark: = «Lörem ipßüm dölör ßit ämet, cönßectetüer ädipißcing elit. Sed ligülä. Präeßent jüßtö tellüß, grävidä eü, tempüß ä, mättiß nön, örci. Näm qüiß lörem. Näm äliqüet elit ßed elit. Phäßellüß venenätiß jüßtö eget enim. Dönec nißl. Pröin mättiß venenätiß jüßtö. Sed äliqüäm pörtä örci. Cräß elit nißl, cönvälliß qüiß, tincidünt ät, vehicülä äccümßän, ödiö. Sed möleßtie. Etiäm mölliß feügiät elit. Veßtibülüm änte ipßüm primiß in fäücibüß örci lüctüß et ültriceß pößüere cübiliä Cüräe; Mäecenäß nön nüllä.» ; // mb_strtolower() for( $i = 0 ; $i 30000 ; $i ++) $timeMB = microtime ( true ) — $timeMB ; // MySQL lower() mysql_query ( «set names latin1» ); $timeSQL = microtime ( true ) — $timeSQL ; echo «mb: » . sprintf ( «%.5f» , $timeMB ). » sek. // Result on my notebook: Please, note that when using with UTF-8 mb_strtolower will only convert upper case characters to lower case which are marked with the Unicode property «Upper case letter» («Lu»). However, there are also letters such as «Letter numbers» (Unicode property «Nl») that also have lower case and upper case variants. These characters will not be converted be mb_strtolower! Example: Big internet-companies (like Google) do match both variants as semantically equal (since the representations only differ in case). Since I was not finding any proper solution in the internet on how to map all UTF8-strings to their lowercase counterpart in PHP, I offer the following hard-coded extended mb_strtolower function for UTF-8 strings: The function wraps the existing function mb_strtolower() and additionally replaces uppercase UTF8-characters for which there is a lowercase representation. Since there is no proper Unicode uppercase and lowercase character-table in the internet that I was able to find, I checked the first million UTF8-characters against the Google-search and -KeywordTool and identified the following 78 characters as uppercase-characters, not being replaced by mb_strtolower, but having a UTF8 lowercase counterpart. //the numbers in the in-line-comments display the characters’ Unicode code-points (CP). $utf8_string = mb_strtolower ( $utf8_string , «UTF-8» ); $utf8_string = strtr ( $utf8_string , $additional_replacements ); return $utf8_string ; C++: Перевести строку в нижний регистр.В си есть функция для перевода в нижний регистр strlwr(), но можно написать и собственную реализацию: 2 Responsesкрайне рекомендую придерживаться какого-либо стиля программирования (java/GNU/etc prgramming style). в этой программе допущена весьма значительная ошибка, превращающая асимптотику O(N) в O(N^2). очевидно считать в цикле каждый раз длину строки долго. решение: так же настоятельно рекомендую переходить на чистый С++. Можно и перейти. Согласен, что в C++ строки лучше. В чистом си нет понятия строки. Есть массив символов и всё… Про ошибку: в большом проекте — да. Но здесь это настолько не важно… Добавить комментарий Отменить ответДля отправки комментария вам необходимо авторизоваться. Перевод букв из верхнего регистра в нижний и наоборот.int tolower(int c) нижний регистр int toupper(int c) верхний регистр Функции возвращают преобразованную букву. Пример 5: Преобразовать символы к верхнему регистру (работа с указателем). Функция toupper() преобразует свой аргумент к верхнему регистру. char str[] = «Small text»,*p; 4. Работа со строками — Различают две группы функций: — Функции, начинающимися с str, работают с С-строками (\0 — конец строки). — Функции, начинающиеся с mem, работают с массивами символов, позволяя работать и с нулевыми байтами. функции, модифицирующие один из аргументов (напр.: копирование, слияние) всегда изменяют первый аргумент. Функции группы str С-строки (\0 — конец строки). char *strcpy(char *s1, char *s2) копирует строку s2 в s1. Возвращает s1. char *strcat(char *s1, char *s2) объединяет строки s1 и s2 (дописывает s2 в s1). Возвращает s1. int strcmp(char *s1, char *s2) сравнивает строки. Возвращает 0 для совпадающих строк, отрицательное значение при s1 s2. int strlen(char *s1) Возвращает длину строки s1 char *strchr(char *s1, char sim) Возвращает указатель на первое вхождение символа simв строку s1 char *strstr(char *s1, char *s2) Возвращает указатель на первое вхождение строки s2в строку s1 Аналогичные функции с контролем длины строки: char *strncpy(char *s1, char *s2, size_t n) копирует строку s2 в s1, но копируется не более n символов. Возвращает s1. char *strncat(char *s1, char *s2, size_t n) int strncmp(char *s1, char *s2, size_t n) char *strerror(size_t n) возвращает строку сообщения, соответсвующего ошибке с номером n. — Функции группы mem аргументы -массивы символов, позволяют работать и с нулевыми байтами. void *memcpy(void *dst, void *src, size_t len) копирует len байтов (включая нулевые) из src в dst. Возвращает dst. void *memove(void *dst, void *src, size_t len) делает то же, что и memcpy. Это — единственная функция, которая правильно копирует перекрывающиеся объекты. int memcmp(void *s1, void *s2, size_t len) аналог strcmp, но с учетом нулевых байтов. void *memset(void *s, int c, size_t len) заполняет первые len байтов массива s символом c. Пример 6: Выполнить различные действия с двумя строками, введенными с клавиатуры. using namespace std; int main(int argc, char* argv[]) // ввод строк с клавиатуры // определение длины строк using namespace std; int main(int argc, char* argv[]) int i, len=0, comlen=0, k; // ВВОД ТЕКСТА В МАССИВ text С КЛАВИАТУРЫ : // устанавливаем указатель p на начало массива text // цикл ввода заканчиваем, когда введена пустая строка // после записи очередной строки перемещаем указатель (+ длина строки) for (p=text, k=0; strlen(q)!=0; p=p+len+1,k++) < gets(q);// ввод строки с клавиатуры strcpy(p,q); // копирование в text len= strlen(q);// определение длины строки comlen +=len+1; //общая длина текста – Объявить статический массив – Вводить текст построчно с клавиатуры и также построчно размещать в памяти – текст содержит латинские буквы, цифры, знаки. 2. При выполнении задания : – создавать свои функции – применять библиотечные функции 3. На экран выводить поясняющие тексты. 4. Выводить как исходный текст, так и текст после обработки (отформатированный). Как преобразовать std::string в нижний регистр?Я хочу преобразовать std::string в нижний регистр. Я знаю о функции tolower() , однако в прошлом у меня были проблемы с этой функцией, и это вряд ли идеально, так как использование с std::string потребует итерации по каждому символу. Есть ли альтернатива, которая работает в 100% случаев? Вы действительно не собираетесь уходить без итерации каждого персонажа. Там нет никакого способа узнать, является ли символ строчными или прописными в противном случае. Если вы действительно ненавидите tolower() , вот специальная альтернатива только для ASCII, которую я не рекомендую вам использовать: Имейте в tolower() что tolower() может выполнять подстановку только для одного байта символа, что плохо подходит для многих сценариев, особенно при использовании многобайтовой кодировки, такой как UTF-8. ТЛ; др Используйте библиотеку ICU. Сначала вы должны ответить на вопрос: какова кодировка вашей std::string ? Это ISO-8859-1? Или, возможно, ISO-8859-8? Или кодовая страница Windows 1252? Знает ли это то, что вы используете для преобразования прописных букв в строчные? (Или он с треском проваливается для персонажей более 0x7f ?) Если вы используете UTF-8 (единственный разумный выбор среди 8-битных кодировок) с std::string качестве контейнера, вы уже обманываете себя, полагая, что вы все еще контролируете вещи, потому что вы храните многобайтовый символ последовательность в контейнере, который не знает о многобайтовой концепции. Даже .substr() простая .substr() как .substr() — это бомба замедленного действия. (Поскольку разбиение многобайтовой последовательности приведет к недопустимой (sub-) строке.) И как только вы попробуете что-то вроде std::toupper( ‘ß’ ) , в любой кодировке у вас будут большие проблемы. (Поскольку это просто невозможно сделать «правильно» со стандартной библиотекой, которая может доставить только один символ результата, а не «SS» необходимый здесь.) [1] Другим примером будет std::tolower( ‘I’ ) , который должен давать разные результаты в зависимости от локали. В Германии ‘i’ будет правильным; в Турции ‘ı’ (LATIN SMALL LETTER DOTLESS I) — это ожидаемый результат (который, опять же, больше чем один байт в кодировке UTF-8). Тогда есть смысл, что стандартная библиотека зависит от того, какие локали поддерживаются на машине, на которой работает ваше программное обеспечение. и что вы делаете, если это не так? Итак, что вы действительно ищете, так это строковый класс, который способен правильно std::basic_string<> все это, и это не какой-либо из вариантов std::basic_string<> . (С++ 11 примечание: std::u16string и std::u32string лучше, но все же не идеально. С++ 20 привел std::u8string , но все это делает указание кодировки. Во многих других отношениях они все еще остаются неосведомленный о механике Unicode, как нормализация, сопоставление. ) Хотя Boost выглядит неплохо, с точки зрения API, Boost.Locale по сути является оболочкой для ICU. Если Boost скомпилирован с поддержкой ICU. если нет, Boost.Locale ограничен поддержкой локали, скомпилированной для стандартной библиотеки. И поверьте мне, заставить Boost компилироваться с ICU иногда бывает очень больно. (Для Windows нет предварительно скомпилированных двоичных файлов, так что вам придется поставлять их вместе с вашим приложением, и это открывает новую банку с червями. ) Поэтому лично я бы порекомендовал получить полную поддержку Unicode прямо из уст в уста и напрямую использовать библиотеку ICU: Компилируем (с G++ в этом примере): [1] В 2020 году Совет по немецкой орфографии постановил, что «ẞ» U + 1E9E LATIN CAPITAL LAPTER SHARP S может быть официально использован, как вариант, помимо традиционной конверсии «SS», чтобы избежать двусмысленности, например, в паспортах (где имена пишутся с большой буквы)). Мой прекрасный пример, устарел по решению комитета. Перевод букв из верхнего регистра в нижний и наоборот.int tolower(int c) нижний регистр int toupper(int c) верхний регистр Функции возвращают преобразованную букву. Пример 5: Преобразовать символы к верхнему регистру (работа с указателем). Функция toupper() преобразует свой аргумент к верхнему регистру. char str[] = «Small text»,*p; 4. Работа со строками — Различают две группы функций: — Функции, начинающимися с str, работают с С-строками (\0 — конец строки). — Функции, начинающиеся с mem, работают с массивами символов, позволяя работать и с нулевыми байтами. функции, модифицирующие один из аргументов (напр.: копирование, слияние) всегда изменяют первый аргумент. Функции группы str С-строки (\0 — конец строки). char *strcpy(char *s1, char *s2) копирует строку s2 в s1. Возвращает s1. char *strcat(char *s1, char *s2) объединяет строки s1 и s2 (дописывает s2 в s1). Возвращает s1. int strcmp(char *s1, char *s2) сравнивает строки. Возвращает 0 для совпадающих строк, отрицательное значение при s1 s2. int strlen(char *s1) Возвращает длину строки s1 char *strchr(char *s1, char sim) Возвращает указатель на первое вхождение символа simв строку s1 char *strstr(char *s1, char *s2) Возвращает указатель на первое вхождение строки s2в строку s1 Аналогичные функции с контролем длины строки: char *strncpy(char *s1, char *s2, size_t n) копирует строку s2 в s1, но копируется не более n символов. Возвращает s1. char *strncat(char *s1, char *s2, size_t n) int strncmp(char *s1, char *s2, size_t n) char *strerror(size_t n) возвращает строку сообщения, соответсвующего ошибке с номером n. — Функции группы mem аргументы -массивы символов, позволяют работать и с нулевыми байтами. void *memcpy(void *dst, void *src, size_t len) копирует len байтов (включая нулевые) из src в dst. Возвращает dst. void *memove(void *dst, void *src, size_t len) делает то же, что и memcpy. Это — единственная функция, которая правильно копирует перекрывающиеся объекты. int memcmp(void *s1, void *s2, size_t len) аналог strcmp, но с учетом нулевых байтов. void *memset(void *s, int c, size_t len) заполняет первые len байтов массива s символом c. Пример 6: Выполнить различные действия с двумя строками, введенными с клавиатуры. using namespace std; int main(int argc, char* argv[]) // ввод строк с клавиатуры // определение длины строк using namespace std; int main(int argc, char* argv[]) int i, len=0, comlen=0, k; // ВВОД ТЕКСТА В МАССИВ text С КЛАВИАТУРЫ : // устанавливаем указатель p на начало массива text // цикл ввода заканчиваем, когда введена пустая строка // после записи очередной строки перемещаем указатель (+ длина строки) for (p=text, k=0; strlen(q)!=0; p=p+len+1,k++) < gets(q);// ввод строки с клавиатуры strcpy(p,q); // копирование в text len= strlen(q);// определение длины строки comlen +=len+1; //общая длина текста – Объявить статический массив – Вводить текст построчно с клавиатуры и также построчно размещать в памяти – текст содержит латинские буквы, цифры, знаки. 2. При выполнении задания : – создавать свои функции – применять библиотечные функции 3. На экран выводить поясняющие тексты. 4. Выводить как исходный текст, так и текст после обработки (отформатированный). 3. Операции со строками. Часть 2.Элементы символьных строк могут быть преобразованы из одного регистра в другой. Для этого используются стандартные функции _strlwr() и _strupr(). Следует отметить, что в некоторых версиях компиляторов имена данных функций могут следовать без ведущего символа подчеркивания. char* _strlwr(char* str) Следующий фрагмент показывает применение функции _strlwr(): char str[] = «ABRACADABRA»; После вызова функции строка str будет преобразована в «abracadabra». char* _strupr (char* str) Данная функция преобразует строку символов, на которую указывает str, в прописные буквы (к верхнему регистру). В результате работы функции возвращается указатель на полученную строку. char str[]=»pacific ocean»; В результате будет выведено: PACIFIC OCEAN Здесь пользователю предлагается ввести свой возраст. Функция cin.getline () помещает в строку str введенную последовательность (до трех) символов, после чего следует проверка первого введенного элемента массива на принадлежность к буквенной, управляющей последовательностей или символам пунктуации. Если результат соответствующей проверки положительный, пользователю предлагается ввести данные повторно. В противном случае все введенные элементы строки проверяются на принадлежность к цифровому набору данных. Если хотя бы один из символов не удовлетворяет проверяемому условию, цикл ввода повторяется сначала. После корректного ввода данных на экран выводится сообщение о возрасте пользователя. Функция обращения строки strrev() меняет порядок следования символов на обратный (реверс строки). Данная функция имеет прототип: char* strrev(char* str) Следующий пример демонстрирует работу функции strrev (). char str [6] ; Одна из часто встречаемых задач при работе со строками — поиск отдельного символа или даже группы символов. Библиотека string.h предлагает следующий набор стандартных функций. char* strchr(const char* string, int c) Данная функция производит поиск символа с в строке string и в случае успешного поиска возвращает указатель на место первого вхождения символа в строку. Если указанный символ не найден, функция возвращает NULL. Поиск символа осуществляется с начала строки. char str[6] ; В результате работы программы указатель pStr будет указывать на подстроку «ивет», т.е. хранить адрес символа ‘и’. char* strrchr(const char* string, int c) Данная функция возвращает указатель на последний, совпавший с заданным с, символ в строке string. Если символ не найден, возвращается значение NULL. size_t strspn(const char* string, const char* group) Функция проверяет каждый символ строки string на соответствие каждому из символов строки group. В результате работы функции возвращается число совпавших символов. char str[] = «Загрузка параметров БД»; На экран будет выведено число 17, так как символы строки str и подстроки substr совпадают вплоть до 17-й позиции. Приведенная функция различает регистр символов. size_t strcpn(const char* strl, const char* str2) Эта функция сопоставляет символы строки strl и str2 и возвращает длину строки strl, не входящей в str2. Таким образом, можно определить, в какой позиции происходит пересечение двух символьных массивов: Переменная index получит значение 4, так как в этой позиции строки имеют первый общий элемент. Эта функция отыскивает место вхождения в строку strl любого из символов строки str2. Если символы найдены, возвращается место первого вхождения любого символа из str2 в строку strl. В противном случае функция возвращает NULL. char strl[]=»abcdefghijk»; В результате будет выведена подстрока «bcdefghijk», так как символ ‘b’ из строки str2 встречается в строке strl раньше других. При необходимости поиска в одной строке последовательности символов, заданной в другом символьном массиве (подстроке, лексеме), стандартная библиотека string.h предлагает воспользоваться одной из следующих функций. char* strstr(const char* str, const char* substr) Данная функция осуществляет сканирование строки str и находит место первого вхождения подстроки substr в строку str. В случае успешного поиска функция strstr возвращает указатель на первый символ строки str, начиная с которого следует точное совпадение части str обязательно со всей лексемой substr. Если подстрока substr не найдена в str, возвращается NULL. char strl[]=»Производится поиск элемента»; На экран будет выведено «поиск элемента», так как подстрока, содержащаяся в str2, находится внутри строки strl и функция strstr () установит указатель ptr на соответствующий элемент символьного массива strl. char* strtok(char* str, const char* delim) Эта функция выполняет поиск в строке str подстроки, обрамленной с обеих сторон любым символом-разделителем из строки delim. В случае успешного поиска данная функция обрезает строку str, помещая символ ‘ \0’ в месте, где заканчивается найденная лексема. Таким образом, при повторном поиске лексемы в указанной строке str первым параметром следует указывать NULL. Так как strtok () модифицирует строку-оригинал, рекомендуется предварительно сохранять копию последней. Приведенный ниже пример иллюстрирует вышесказанное. char str []=»Язык программирования C++»; +-=»; В данной программе объявляется подлежащая анализу строка str, подстрока, содержащая набор разделителей Delimiters и указатель на символьный тип данных ptr. Вызов функции strtok (str, Delimiters) сканирует строку str и как только в ней встретится любой символ, входящий в подстроку Delimiters (в данном случае это символ пробела), указатель ptr станет ссылаться на начало исходной строки до найденного символа. То есть ptr будет содержать: ptr = strtok (NULL, Delimiters); что, фактически, соответствует локализации следующего слова предло-жения, и найденная последовательность символов выводится на экран. Функции преобразования типа Функции преобразования данных довольно часто используются, как следует из названия, для преобразования одного типа данных в другой тип. В приведенной ниже табл. 8.3 перечислены основные функции, их прототипы подключаются в заголовочном файле stdlib. h. Таблица 8.3. Преобразование данных преобразует строку символов в число с плавающей точкой |