Преобразование строки в нижний регистр

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, и разница между строчными и прописными буквами постоянна. Преобразования проверяют эти значения, чтобы перевести их в нижний регистр — в основном играя в числовое лимбо.

Смотрите также

Для любопытных котов, жаждущих большего:

Хотите понять Unicode? Попробуйте ICU Project: