Приведение строки к нижнему регистру
Это зависит от того, в какой кодировке строка. Например, строка задается строковым литералом const char *string = «Мама Милу била битой» в файле с исходным кодом. Если этот файл сохранен в utf-8, то и строка будет закодирована в utf-8, если файл в cp-1251, то и со строкой будет так же. Способы перевода в нижний регистр без использования стандартных библиотечных функций — разные.
– user239133
8 фев 2018 в 20:28
Для кодировки cp1251 посмотрите на таблицу кодов символов. Обратите внимание на одинаковое расстояние между символами в верхнем и нижнем регистре (за исключением ёЁ (впрочем, их давно пора запретить -))
Как привести строку к нижнему регистру в C++
В языке программирования C++ есть несколько способов привести строку к нижнему регистру. Рассмотрим некоторые из них.
Использование цикла
Один из самых простых способов — использовать цикл для перебора всех символов строки и применения функции tolower() к каждому символу. Вот пример кода:
#include #include std::string toLowerCase(std::string str) < for (int i = 0; i < str.length(); i++) < str[i] = std::tolower(str[i]); >return str; > int main()
В этом примере мы объявляем функцию toLowerCase(), которая принимает строку в качестве параметра и возвращает приведенную к нижнему регистру строку. Затем мы вызываем эту функцию в функции main() и выводим результат.
Использование библиотечной функции transform()
Другой способ — использовать функцию transform() из библиотеки algorithm. Эта функция применяет заданную функцию к каждому элементу диапазона и записывает результат в другой диапазон.
#include #include #include #include int main()
В этом примере мы используем функцию transform() для приведения строки к нижнему регистру. В качестве аргументов мы передаем итераторы, указывающие на начало и конец строки, и функцию ::tolower, которая будет применена к каждому элементу строки. Затем мы выводим результат.
Использование функции boost::algorithm::to_lower()
Если вы используете библиотеку Boost, вы можете воспользоваться функцией boost::algorithm::to_lower() для приведения строки к нижнему регистру.
#include #include int main()
В этом примере мы подключаем заголовочный файл boost/algorithm/string.hpp, который содержит функцию to_lower(). Затем мы вызываем эту функцию для приведения строки к нижнему регистру и выводим результат.
Использование функции std::locale
Если вам нужно обрабатывать строки, содержащие символы юникода, вы можете воспользоваться функцией std::locale для установки локали и функцией std::tolower() с учетом установленной локали. Вот пример кода:
#include #include #include std::wstring toLowerCase(std::wstring str) < std::locale loc(""); for (std::wstring::size_type i = 0; i < str.length(); i++) < str[i] = std::tolower(str[i], loc); >return str; > int main()
В этом примере мы используем функцию std::locale для установки локали и функцию std::tolower() с учетом установленной локали для приведения строки к нижнему регистру. Мы также используем std::wstring и std::wcout для работы с символами юникода.
Заключение
В этой статье мы рассмотрели несколько способов привести строку к нижнему регистру в языке программирования C++. Вы можете выбрать любой из этих способов в зависимости от ваших потребностей и предпочтений.
Преобразование строки в нижний регистр
Есть функция tolower, которая переводит символы в нижний регистр. Можно применить ее ко всем символам строки:
#include #include #include #include int main()
Отслеживать
ответ дан 27 ноя 2011 в 14:13
11.7k 25 25 серебряных знаков 38 38 бронзовых знаков
Изящно и элегантно. Кстати, для С++ есть специальный рекомендованный хедер cctype
27 ноя 2011 в 14:20
@skegg поменял, спасибо!
17 мар 2019 в 20:38
Красиво, но вызывает UB на отрицательных кодах символов. Нужен std::transform(. [](unsigned char c)
18 мар 2019 в 16:11
Вроде такой функции нет, можно пройти по всем символам строки, и к ним применить tolower(). Или вместо tolower() использовать добавить вычесть:
char A; . //initialization A = A - 'A' + 'a'; // tolower; A = tolower(A); // tolower from ctype.h
Отслеживать
ответ дан 27 ноя 2011 в 14:11
Sergii Kozlov Sergii Kozlov
2,468 16 16 серебряных знаков 13 13 бронзовых знаков
«Добавить вычесть» — не понял идею. Объясните, пожалуйста.
27 ноя 2011 в 14:16
добавить вычесть, основывается на ASCII кодах символов: если в A у нас содержится ‘B’, то отняв ‘A’ — получим 1, а потом прибавив ‘a’ получим ‘b’. Ну это вообще на крайняк, если забыл что где лежит. И в случае с другими раскладками (к примеру кириллица) возникнут проблемы, так как их коды идут не под ряд.
27 ноя 2011 в 14:19
А если лежит в чаре ‘a’, т.е. символ в нижнем регистре, то что в результате получится?
27 ноя 2011 в 14:21
Ну для этого я всегда выполняю проверку ‘A’
27 ноя 2011 в 14:23
Угу, без этого никуда. Но лучше использовать стандартную функцию, которая будет делать то же самое. Как минимум сэкономите время.
Преобразование строки в нижний регистр
Есть функция tolower, которая переводит символы в нижний регистр. Можно применить ее ко всем символам строки:
#include #include #include #include int main()
Отслеживать
ответ дан 27 ноя 2011 в 14:13
11.7k 25 25 серебряных знаков 38 38 бронзовых знаков
Изящно и элегантно. Кстати, для С++ есть специальный рекомендованный хедер cctype
27 ноя 2011 в 14:20
@skegg поменял, спасибо!
17 мар 2019 в 20:38
Красиво, но вызывает UB на отрицательных кодах символов. Нужен std::transform(. [](unsigned char c)
18 мар 2019 в 16:11
Вроде такой функции нет, можно пройти по всем символам строки, и к ним применить tolower(). Или вместо tolower() использовать добавить вычесть:
char A; . //initialization A = A - 'A' + 'a'; // tolower; A = tolower(A); // tolower from ctype.h
Отслеживать
ответ дан 27 ноя 2011 в 14:11
Sergii Kozlov Sergii Kozlov
2,468 16 16 серебряных знаков 13 13 бронзовых знаков
«Добавить вычесть» — не понял идею. Объясните, пожалуйста.
27 ноя 2011 в 14:16
добавить вычесть, основывается на ASCII кодах символов: если в A у нас содержится ‘B’, то отняв ‘A’ — получим 1, а потом прибавив ‘a’ получим ‘b’. Ну это вообще на крайняк, если забыл что где лежит. И в случае с другими раскладками (к примеру кириллица) возникнут проблемы, так как их коды идут не под ряд.
27 ноя 2011 в 14:19
А если лежит в чаре ‘a’, т.е. символ в нижнем регистре, то что в результате получится?
27 ноя 2011 в 14:21
Ну для этого я всегда выполняю проверку ‘A’
27 ноя 2011 в 14:23
Угу, без этого никуда. Но лучше использовать стандартную функцию, которая будет делать то же самое. Как минимум сэкономите время.