C++:
Преобразование строки в нижний регистр
Как это сделать:
Вот как вы можете устранить различия в регистре в C++, заставляя заглавные буквы уступать место строчным:
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string origText = "C++ заставляет меня Кричать!";
std::string lowerText = origText;
std::transform(origText.begin(), origText.end(), lowerText.begin(),
[](unsigned char c) { return std::tolower(c); });
std::cout << "Оригинал: " << origText << std::endl;
std::cout << "В нижнем регистре: " << lowerText << std::endl;
return 0;
}
Вывод:
Оригинал: C++ заставляет меня Кричать!
В нижнем регистре: c++ заставляет меня кричать!
Подробнее
Раньше, до появления std::transform
и лямбда-выражений, программисты проходились циклом по каждому символу и вручную преобразовывали его в нижний регистр — это было немного более тяжелой работой. std::transform
вместе с std::tolower
работает эффективно и с меньшей вероятностью ошибок, хотя, учитывая C++, существуют и другие способы. Обратите внимание на локаль: поведение std::tolower
может отличаться. Если ваш проект может использовать Unicode, обратите внимание на сторонние библиотеки вроде ICU, разработанные для глобальной сцены.
Также стоит упомянуть добавление в C++20, std::ranges::transform
, которое приносит трансформации на основе диапазонов, обновляя синтаксис и придерживаясь философии “диапазона”, согласно которой кодирование должно быть более интуитивным и менее подверженным ошибкам.
Что касается деталей реализации, каждый символ имеет значение ASCII, и разница между строчными и прописными буквами постоянна. Преобразования проверяют эти значения, чтобы перевести их в нижний регистр — в основном играя в числовое лимбо.
Смотрите также
Для любопытных котов, жаждущих большего:
- Справочник C++ для
std::transform
: https://en.cppreference.com/w/cpp/algorithm/transform - Справочник C++ для
std::tolower
: https://en.cppreference.com/w/cpp/string/byte/tolower - Детали о
std::ranges
в C++20: https://en.cppreference.com/w/cpp/ranges
Хотите понять Unicode? Попробуйте ICU Project:
- ICU Project: http://site.icu-project.org/home