Strlwr привести к нижнему регистру


Как в 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, а чем её заменили? Или похожей функции совсем нету?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

  • Чем заменили strlwr?, phpcoder, 14:11 , 23-Июн-08, (1)
    • Чем заменили strlwr?, zkrvova, 14:21 , 23-Июн-08, (2)
      • Чем заменили strlwr?, phpcoder, 14:28 , 23-Июн-08, (3)
        • Чем заменили strlwr?, arturpub, 08:16 , 24-Июн-08, (4)
          • ?, Andrey Mitrofanov, 09:40 , 24-Июн-08, (5)
            • ?, arturpub, 09:44 , 24-Июн-08, (6)
              • ?, Andrey Mitrofanov, 13:23 , 24-Июн-08, (9)

          • Чем заменили strlwr?, vic, 12:37 , 24-Июн-08, (8)
            • Чем заменили strlwr?, arturpub, 14:53 , 24-Июн-08, (10)
              • Чем заменили strlwr?, vic, 16:54 , 24-Июн-08, ( 11 )
                • Чем заменили strlwr?, arturpub, 20:06 , 24-Июн-08, ( 12 )
                  • Чем заменили strlwr?, vic, 14:57 , 26-Июн-08, ( 13 )
                    • Чем заменили strlwr?, arturpub, 04:30 , 27-Июн-08, ( 14 )
        • Чем заменили strlwr?, zkrvova, 10:54 , 24-Июн-08, (7)

Сообщения по теме [Сортировка по времени | RSS]

>Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или
>похожей функции совсем нету?

Что делает эта ваша ф-ция? В гуле уже искали по словам «strlwr linux» ?

1. «Чем заменили strlwr?»
Сообщение от phpcoder (??) on 23-Июн-08, 14:11
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. «Чем заменили strlwr?»
Сообщение от zkrvova (ok) on 23-Июн-08, 14:21

>>Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или
>>похожей функции совсем нету?
>
>Что делает эта ваша ф-ция? В гуле уже искали по словам «strlwr
>linux» ?

Она переводит все семволы строки в нижний регистр. В гугле искал. Это сишная функция.

Высказать мнение | Ответить | Правка | Наверх | 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

>ну или так если очень уж длинная.
>for (char *p = str; *p; p++) *p = tolower(*p);
>
>кстати всем вопрос на засыпку: сколько раз вычисляется условие цикла ?

Код был приведен для примера, ясень пень юзать strlen() в условии не гуд.
А ваще:
for (char *p = str; p && *p; ++p) *p = tolower(*p); // и то, только в c99 или С++, иначе char *p объявляется до цикла.
и т.д.

Смысл примера был в другом.

А если уж хочется вопросов на засыпку, то:
1. смотрим man tolower(), на предмет возвращаемого значения =)
2. думаем что случится если кодировка в строке будет несколько не та.. не соответствовать локали так сказать..
3. ну и наконец utf-8, для которой это не работает ни разу. А если еще осознать что в utf-8 один и тот же символ в нижнем и верхнем регистре может быть представлен разным количеством байтов.
4. а еще бывает w >http://www-306.ibm.com/software/globalization/icu/index.jsp

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. «Чем заменили strlwr?»
Сообщение от arturpub (ok) on 24-Июн-08, 14:53

повторяющееся определение strlwr есть в гугле. кстати сказать функции из string.h никогда не проверяли аргументы на NULL, на соответствие кодировки/локали и есть тама utf-8 или нет; определить это — задача программиста. для wchar_t будет соотв. wcslwr.
tolower вернул int, что и должен был. (??)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11 . «Чем заменили strlwr?»
Сообщение от vic (??) on 24-Июн-08, 16:54

>повторяющееся определение strlwr есть в гугле.

гугл это еще не posix.


>кстати сказать функции из string.h никогда
>не проверяли аргументы на NULL, на соответствие кодировки/локали и есть тама
>utf-8 или нет; определить это — задача программиста. для wchar_t будет
>соотв. wcslwr.

Я продемонстрировал ненужность указания недочетов в примере, это всего лишь пример. На вашем же примере показав как минимум три недочета в коде. Проверять или не проверять на null в вашем примере тоже самое что писать в условии цикла strlen(), т.к. и то, и то плохой стиль. Задача программиста писать переносимый код, а не код который завтра же придется править только потому что у клиента другая кодировка. В случае введения поддержки utf-8 такой код править — полный абзац (по опыту), особенно для интернационального приложения.

>tolower вернул int, что и должен был. (??)

Да, именно так, и принимает int, а данные char. Функция небезопасная. Хотя в данном примере порча строки при некорректной локали это максимум что может произойти. Но все же были случаи когда это порождало серьезные баги.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12 . «Чем заменили strlwr?»
Сообщение от arturpub (ok) on 24-Июн-08, 20:06

простите, признаюсь что тупо напал на strlen.
вы меня не совсем поняли. я говорю о том, как на самом деле определена функция, пусть не posix’ом, то хотя бы большим количеством описаний в сети. прочитайте его еще раз. написана она в соотв. с теми требованиями, которые были к ней до этого, своего ничо не добавлял ;) т.о. задачу по реализации считаю выполненной правильно.

если у клиента другая кодировка, то (раз уж мы работаем с содержимым строк как с символами, а не как с байтами туда-обратно) при «не той» кодировке «перестанет» работать и весь 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

>простите, признаюсь что тупо напал на strlen.
>вы меня не совсем поняли. я говорю о том, как на самом
>деле определена функция, пусть не posix’ом, то хотя бы большим количеством
>описаний в сети. прочитайте его еще раз. написана она в соотв.
>с теми требованиями, которые были к ней до этого, своего ничо
>не добавлял ;) т.о. задачу по реализации считаю выполненной правильно.

ОК
>
>если у клиента другая кодировка, то (раз уж мы работаем с содержимым строк как с символами, а не как с байтами туда-обратно) при «не той» кодировке «перестанет» работать и весь clib, так ?

нет перстанет работать контекст-зависимая часть функций, т.к. строка (char*) остается нуль-терминированной (до тех пор пока туда не начнут пихать совсем черт знает что), т.е. всякие strcmp, strcpy, работать будут.

> для выбора другой локали есть setlocale(), utf-8 же clib’ом поддерживается только через mbs->wcs, и функции работы с wcs имеют одноименный префикс. где уж это мой недочет ? если программист _действительно_ планирует работу с толстыми буквами, то ему нужно подумать об этом заранее, а не ругать имеющиеся средства. то есть конвертим utf8 в wcs и применяем wcslwr/towlower. с ucs4 конечно на clib’е тяжелее.

Верно, и думать надо т.к. сейчас основной кодировкой становится utf-8, а с strlwr-ориентированными решениями будет беда.

>
>насчет локали. если setlocale() вызвана с верным аргументом, то для любой 8-битной
>кодировки tolower() вернет правильное значение, даже для utf8 (т.к. utf8 в
>плане однобайтных символов идентична 7-bit ascii, и ни одна русская буква
>не попортится). и разумеется *str*lwr не обратит неаскёвую часть.

Вот-вот для utf-8 функция например вообще не работает, преобразование будет не выполнено. А это явно не то что хотелось бы.

>
>избитый нами int tolower(int) принимает в нашем контексте всегда не более чем
>char; в мануале сказано, что если «c is not an unsigned
>char value, or EOF, the behaviour of these functions is undefined.»,
>иначе оно возвращает int, который без потерь кастится в char. тут
>опять не вижу проблем в применении.

в данном конкретном случае да.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14 . «Чем заменили strlwr?»
Сообщение от arturpub (ok) on 27-Июн-08, 04:30

>Вот-вот для utf-8 функция например вообще не работает, преобразование будет не выполнено.
>А это явно не то что хотелось бы.

мы явно погнули разные линии 8)
иногда ведь это именно то, что хотелось бы, вот тогда мы и называем это желание «strlwr». вспомните хотя бы сканеры языков, сетевых протоколов, и т.д., где перемешаны 2 локали: C и какая-то еще — они их разделяют. не то что бы в этих случаях не подходила реализация, которая поддерживает еще и утф, нет. просто там этого не надо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. «Чем заменили strlwr?»
Сообщение от zkrvova (ok) on 24-Июн-08, 10:54

>>Она переводит все семволы строки в нижний регистр.
>
>Стандартной нет. Придётся написать свою, благо это очень легко:
>
>for (int i = 0; i
> string[i] = tolower(string[i]);
>>
>
>Если на С++, то можно transform()’ом пройтись или использовать to_lower() из буста.
>

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() — Преобразует строку в нижний регистр

User Contributed Notes 6 notes

Note 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()
$timeMB = microtime ( true );

for( $i = 0 ; $i 30000 ; $i ++)
$lower = mb_strtolower ( » $text /no-cache- $i » );

$timeMB = microtime ( true ) — $timeMB ;

// MySQL lower()
$timeSQL = microtime ( true );

mysql_query ( «set names latin1» );
for( $i = 0 ; $i 30000 ; $i ++) <
$r = mysql_fetch_row ( mysql_query ( «select lower(‘ $text /no-cache- $i ‘)» ));
$lower = $r [ 0 ];
>

$timeSQL = microtime ( true ) — $timeSQL ;

echo «mb: » . sprintf ( «%.5f» , $timeMB ). » sek.
» ;
echo «sql: » . sprintf ( «%.5f» , $timeSQL ). » sek.
» ;

// Result on my notebook:
// mb: 11.50642 sek.
// sql: 5.44143 sek.

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:
The Roman letters Ⅰ, Ⅱ, Ⅲ, . Ⅿ (UTF-8 code points 8544 through 8559) also exist in their respective lower case variants ⅰ, ⅱ, ⅲ, . ⅿ (UTF-8 code points 8560 through 8575) and should, in my opinion, also be converted by mb_strtolower, but they are not!

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).
function strtolower_utf8_extended ( $utf8_string )
<
$additional_replacements = array
( «Dž» => «dž» // 453 -> 454
, «Lj» => «lj» // 456 -> 457
, «Nj» => «nj» // 459 -> 460
, «Dz» => «dz» // 498 -> 499
, «Ϸ» => «ϸ» // 1015 -> 1016
, «Ϲ» => «ϲ» // 1017 -> 1010
, «Ϻ» => «ϻ» // 1018 -> 1019
, «ᾈ» => «ᾀ» // 8072 -> 8064
, «ᾉ» => «ᾁ» // 8073 -> 8065
, «ᾊ» => «ᾂ» // 8074 -> 8066
, «ᾋ» => «ᾃ» // 8075 -> 8067
, «ᾌ» => «ᾄ» // 8076 -> 8068
, «ᾍ» => «ᾅ» // 8077 -> 8069
, «ᾎ» => «ᾆ» // 8078 -> 8070
, «ᾏ» => «ᾇ» // 8079 -> 8071
, «ᾘ» => «ᾐ» // 8088 -> 8080
, «ᾙ» => «ᾑ» // 8089 -> 8081
, «ᾚ» => «ᾒ» // 8090 -> 8082
, «ᾛ» => «ᾓ» // 8091 -> 8083
, «ᾜ» => «ᾔ» // 8092 -> 8084
, «ᾝ» => «ᾕ» // 8093 -> 8085
, «ᾞ» => «ᾖ» // 8094 -> 8086
, «ᾟ» => «ᾗ» // 8095 -> 8087
, «ᾨ» => «ᾠ» // 8104 -> 8096
, «ᾩ» => «ᾡ» // 8105 -> 8097
, «ᾪ» => «ᾢ» // 8106 -> 8098
, «ᾫ» => «ᾣ» // 8107 -> 8099
, «ᾬ» => «ᾤ» // 8108 -> 8100
, «ᾭ» => «ᾥ» // 8109 -> 8101
, «ᾮ» => «ᾦ» // 8110 -> 8102
, «ᾯ» => «ᾧ» // 8111 -> 8103
, «ᾼ» => «ᾳ» // 8124 -> 8115
, «ῌ» => «ῃ» // 8140 -> 8131
, «ῼ» => «ῳ» // 8188 -> 8179
, «Ⅰ» => «ⅰ» // 8544 -> 8560
, «Ⅱ» => «ⅱ» // 8545 -> 8561
, «Ⅲ» => «ⅲ» // 8546 -> 8562
, «Ⅳ» => «ⅳ» // 8547 -> 8563
, «Ⅴ» => «ⅴ» // 8548 -> 8564
, «Ⅵ» => «ⅵ» // 8549 -> 8565
, «Ⅶ» => «ⅶ» // 8550 -> 8566
, «Ⅷ» => «ⅷ» // 8551 -> 8567
, «Ⅸ» => «ⅸ» // 8552 -> 8568
, «Ⅹ» => «ⅹ» // 8553 -> 8569
, «Ⅺ» => «ⅺ» // 8554 -> 8570
, «Ⅻ» => «ⅻ» // 8555 -> 8571
, «Ⅼ» => «ⅼ» // 8556 -> 8572
, «Ⅽ» => «ⅽ» // 8557 -> 8573
, «Ⅾ» => «ⅾ» // 8558 -> 8574
, «Ⅿ» => «ⅿ» // 8559 -> 8575
, «Ⓐ» => «ⓐ» // 9398 -> 9424
, «Ⓑ» => «ⓑ» // 9399 -> 9425
, «Ⓒ» => «ⓒ» // 9400 -> 9426
, «Ⓓ» => «ⓓ» // 9401 -> 9427
, «Ⓔ» => «ⓔ» // 9402 -> 9428
, «Ⓕ» => «ⓕ» // 9403 -> 9429
, «Ⓖ» => «ⓖ» // 9404 -> 9430
, «Ⓗ» => «ⓗ» // 9405 -> 9431
, «Ⓘ» => «ⓘ» // 9406 -> 9432
, «Ⓙ» => «ⓙ» // 9407 -> 9433
, «Ⓚ» => «ⓚ» // 9408 -> 9434
, «Ⓛ» => «ⓛ» // 9409 -> 9435
, «Ⓜ» => «ⓜ» // 9410 -> 9436
, «Ⓝ» => «ⓝ» // 9411 -> 9437
, «Ⓞ» => «ⓞ» // 9412 -> 9438
, «Ⓟ» => «ⓟ» // 9413 -> 9439
, «Ⓠ» => «ⓠ» // 9414 -> 9440
, «Ⓡ» => «ⓡ» // 9415 -> 9441
, «Ⓢ» => «ⓢ» // 9416 -> 9442
, «Ⓣ» => «ⓣ» // 9417 -> 9443
, «Ⓤ» => «ⓤ» // 9418 -> 9444
, «Ⓥ» => «ⓥ» // 9419 -> 9445
, «Ⓦ» => «ⓦ» // 9420 -> 9446
, «Ⓧ» => «ⓧ» // 9421 -> 9447
, «Ⓨ» => «ⓨ» // 9422 -> 9448
, «Ⓩ» => «ⓩ» // 9423 -> 9449
, «��» => «��» // 66598 -> 66638
, «��» => «��» // 66599 -> 66639
);

$utf8_string = mb_strtolower ( $utf8_string , «UTF-8» );

$utf8_string = strtr ( $utf8_string , $additional_replacements );

return $utf8_string ;
> //strtolower_utf8_extended()

C++: Перевести строку в нижний регистр.

В си есть функция для перевода в нижний регистр strlwr(), но можно написать и собственную реализацию:

2 Responses

крайне рекомендую придерживаться какого-либо стиля программирования (java/GNU/etc prgramming style).
не смешивайте C и C++ это весьма разные языки.

в этой программе допущена весьма значительная ошибка, превращающая асимптотику O(N) в O(N^2).
функция length(s) находит длину строки примерно таким способом:

очевидно считать в цикле каждый раз длину строки долго.

решение:
L = length(s);
цикл до L;

так же настоятельно рекомендую переходить на чистый С++.
http://www.cplusplus.com/reference/string/string/ — плюсовые стринги имеют гораздо более удобный интерфейс.

Можно и перейти. Согласен, что в 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(). Следует отметить, что в некоторых версиях компиляторов имена данных функций могут следовать без ведущего символа подчеркивания.
Функция _strlwr () принимает в качестве параметра указатель на строку символов, преобразует эту строку к нижнему регистру (строчные символы) и возвращает указатель на полученную строку. Данная функция имеет следующий прототип:


char* _strlwr(char* str)

Следующий фрагмент показывает применение функции _strlwr():

char str[] = «ABRACADABRA»;
_strlwr(str);

После вызова функции строка str будет преобразована в «abracadabra».
Функция _strupr () объявлена следующим образом:

char* _strupr (char* str)

Данная функция преобразует строку символов, на которую указывает str, в прописные буквы (к верхнему регистру). В результате работы функции возвращается указатель на полученную строку.
Следующий пример переводит символы заданной строки в верхний регистр:

char str[]=»pacific ocean»;
_strupr(str);
cout

В результате будет выведено: PACIFIC OCEAN
Приведенные выше функции преобразования строк, работая с указателями, преобразуют исходную строку, которая не может быть восстановлена, поэтому, если в дальнейшем коде программы потребуется воспользоваться оригиналом символьной строки, перед использованием функций _strlwr() и strupr () необходимо сделать копию строки.
На практике довольно широко используются функции проверки принадлежности символов какому-либо диапазону, такие как isalnum(), isalpha(), isascii(), isdigit() и т.д. (см. табл. 8.2), объявленные в заголовочном файле ctype.h. Ниже рассматривается пример использования этого вида функций.

Здесь пользователю предлагается ввести свой возраст. Функция cin.getline () помещает в строку str введенную последовательность (до трех) символов, после чего следует проверка первого введенного элемента массива на принадлежность к буквенной, управляющей последовательностей или символам пунктуации. Если результат соответствующей проверки положительный, пользователю предлагается ввести данные повторно. В противном случае все введенные элементы строки проверяются на принадлежность к цифровому набору данных. Если хотя бы один из символов не удовлетворяет проверяемому условию, цикл ввода повторяется сначала. После корректного ввода данных на экран выводится сообщение о возрасте пользователя.

Функция обращения строки strrev() меняет порядок следования символов на обратный (реверс строки). Данная функция имеет прототип:

char* strrev(char* str)

Следующий пример демонстрирует работу функции strrev ().

char str [6] ;
strcpy(str, RUS(«Привет»));
cout
В результате на экране будет выведена строка «тевирП». Эта функция изменяет строку-оригинал.

Одна из часто встречаемых задач при работе со строками — поиск отдельного символа или даже группы символов. Библиотека string.h предлагает следующий набор стандартных функций.
Функция нахождения символа в строке strсhr () имеет следующий прототип:

char* strchr(const char* string, int c)

Данная функция производит поиск символа с в строке string и в случае успешного поиска возвращает указатель на место первого вхождения символа в строку. Если указанный символ не найден, функция возвращает NULL. Поиск символа осуществляется с начала строки.
Ниже рассматривается фрагмент, осуществляющий поиск заданного символа в строке.

char str[6] ;
strcpy(str, «Привет»);
char* pStr;
pStr = strchr(str,’и’);
cout

В результате работы программы указатель pStr будет указывать на подстроку «ивет», т.е. хранить адрес символа ‘и’.
Функция strrchr () осуществляет поиск заданного символа с конца строки. Она имеет следующий синтаксис:

char* strrchr(const char* string, int c)

Данная функция возвращает указатель на последний, совпавший с заданным с, символ в строке string. Если символ не найден, возвращается значение NULL.
Функция strspn () проводит сравнение символов одной строки с символами другой и возвращает позицию (начиная с нуля), в которой строки перестают совпадать. Данная функция имеет следующий прототип:

size_t strspn(const char* string, const char* group)

Функция проверяет каждый символ строки string на соответствие каждому из символов строки group. В результате работы функции возвращается число совпавших символов.
Следующий пример демонстрирует использование данной функции:

char str[] = «Загрузка параметров БД»;
char substr[] = «Загрузка параметррррр»;
int index=0;
index = strspn(str, substr);
cout

На экран будет выведено число 17, так как символы строки str и подстроки substr совпадают вплоть до 17-й позиции. Приведенная функция различает регистр символов.
Функция strcspn () имеет синтаксис:

size_t strcpn(const char* strl, const char* str2)

Эта функция сопоставляет символы строки strl и str2 и возвращает длину строки strl, не входящей в str2. Таким образом, можно определить, в какой позиции происходит пересечение двух символьных массивов:

char str[] = «abcdefghijk»;
int index;
index = strcspn(str, «elf»);

Переменная index получит значение 4, так как в этой позиции строки имеют первый общий элемент.
Функция strpbrk () объявлена следующим образом:

char* strpbrk(const char* strl, const char* str2)

Эта функция отыскивает место вхождения в строку strl любого из символов строки str2. Если символы найдены, возвращается место первого вхождения любого символа из str2 в строку strl. В противном случае функция возвращает NULL.
Ниже иллюстрируется использование функции strpbrk ():

char strl[]=»abcdefghijk»;
char str2[] = «ecb»;
char* ptr;
ptr=strpbrk(strl, str2) ;
cout

В результате будет выведена подстрока «bcdefghijk», так как символ ‘b’ из строки str2 встречается в строке strl раньше других.

При необходимости поиска в одной строке последовательности символов, заданной в другом символьном массиве (подстроке, лексеме), стандартная библиотека string.h предлагает воспользоваться одной из следующих функций.
Функция strstr () описана следующим образом:

char* strstr(const char* str, const char* substr)

Данная функция осуществляет сканирование строки str и находит место первого вхождения подстроки substr в строку str. В случае успешного поиска функция strstr возвращает указатель на первый символ строки str, начиная с которого следует точное совпадение части str обязательно со всей лексемой substr. Если подстрока substr не найдена в str, возвращается NULL.
Следующий пример показывает использование функции strstr ().

char strl[]=»Производится поиск элемента»;
char str2[] = «поиск»;
char* ptr;
ptr=strstr(strl, str2);
cout

На экран будет выведено «поиск элемента», так как подстрока, содержащаяся в str2, находится внутри строки strl и функция strstr () установит указатель ptr на соответствующий элемент символьного массива strl.
Чтобы найти место последнего вхождения подстроки в строку, можно воспользоваться следующим приемом: обе строки реверсируются с помощью функции strrev(), а затем полученный результат анализируется в функции strstr ().
Функция strtok () имеет синтаксис:

char* strtok(char* str, const char* delim)

Эта функция выполняет поиск в строке str подстроки, обрамленной с обеих сторон любым символом-разделителем из строки delim. В случае успешного поиска данная функция обрезает строку str, помещая символ ‘ \0’ в месте, где заканчивается найденная лексема. Таким образом, при повторном поиске лексемы в указанной строке str первым параметром следует указывать NULL. Так как strtok () модифицирует строку-оригинал, рекомендуется предварительно сохранять копию последней. Приведенный ниже пример иллюстрирует вышесказанное.
Предположим, необходимо разбить, имеющееся в строковом массиве предложение, по словам и вывести каждое из них на экран.

char str []=»Язык программирования C++»;
char *Delimiters = » . ;:\»‘/0123456789@#$%^&*()<><>[]

+-=»;
char *ptr;
ptr = strtok(str, Delimiters);
if (ptr)

В данной программе объявляется подлежащая анализу строка str, подстрока, содержащая набор разделителей Delimiters и указатель на символьный тип данных ptr. Вызов функции strtok (str, Delimiters) сканирует строку str и как только в ней встретится любой символ, входящий в подстроку Delimiters (в данном случае это символ пробела), указатель ptr станет ссылаться на начало исходной строки до найденного символа. То есть ptr будет содержать:
*ptr = «Язык»
Благодаря тому, что функция strtok () помещает в найденном месте нуль-терминатор ‘\0’, исходная строка модифицируется. Таким образом, массив символов str примет значение:
«программирования C++»
Осуществив проверку указателя ptr на существование в операторе if (ptr) , найденное слово выводится на экран. Далее в цикле с помощью функции strtok () находится последний нуль-терминатор строки str:

ptr = strtok (NULL, Delimiters);

что, фактически, соответствует локализации следующего слова предло-жения, и найденная последовательность символов выводится на экран.

Функции преобразования типа

Функции преобразования данных довольно часто используются, как следует из названия, для преобразования одного типа данных в другой тип. В приведенной ниже табл. 8.3 перечислены основные функции, их прототипы подключаются в заголовочном файле stdlib. h.

Таблица 8.3. Преобразование данных

преобразует строку символов в число с плавающей точкой

Илон Маск рекомендует:  is_writable - Определяет, доступен ли файл для записи
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL