Гид по технологиям

Поменять регистр символов в строке

• 4 min read • Программирование • Обновлено 21 Nov 2025
Поменять регистр строки — C++, Python, JS, C
Поменять регистр строки — C++, Python, JS, C

Пластина с печатными символами

Введение

Строка — это последовательность символов. Часто требуется поменять регистр каждого символа на противоположный: буквы в верхнем регистре сделать нижними и наоборот. Это простая операция для ASCII, но при работе с Юникодом и локалями есть подводные камни.

Ключевая идея: пройти по каждому символу и, если он буква, переключить регистр. Для ASCII часто используют арифметику кодов символов или стандартные функции; для Юникода предпочтительнее использовать библиотечные методы, которые учитывают локаль.

Важно: термин “регистр“ означает верхний/нижний регистр буквенных символов; знаки препинания и цифры остаются без изменений.

Условие задачи

Вам дана строка. Нужно преобразовать все буквенные символы этой строки в противоположные по регистру.

Примеры:

  • Вход: “Welcome to MUO” → Выход: “wELCOME TO muo”
  • Вход: “Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.” → Выход: “fUZZY wUZZY WAS A BEAR. fUZZY wUZZY HAD NO HAIR.”
  • Вход: “Tom threw Tim three thumbtacks” → Выход: “tOM THREW tIM THREE THUMBTACKS”

Подходы и когда они работают

  • Простая побуквенная проверка по диапазону ASCII (‘a’..’z’, ‘A’..’Z’) — быстрая, но работает только для латиницы ASCII.
  • Стандартные функции и методы (islower/toupper, .swapcase(), toLowerCase()/toUpperCase()) — надёжнее и лаконичнее; некоторые учитывают локаль/Юникод.
  • Для полного поддержки Юникода используйте соответствующие библиотеки (ICU, встроенные реализации в высокоуровневых языках).

Важно: многие примеры ниже демонстрируют работу на ASCII-символах. Для текстов с акцентированными буквами (например, «İ», «ß», «Ł») поведение может отличаться.

C++: побуквенная реализация (ASCII)

Ниже — простая функция, которая меняет регистр букв ASCII, используя проверку диапазона кодов.

// C++ program to convert characters of string to opposite case
#include 
#include 
using namespace std;

string convertString(string& str)
{
    int length = str.length();
    for (int i = 0; i < length; i++)
    {
        // Если символ в нижнем регистре, сделать верхним
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = str[i] - 32;
        }
        // Если символ в верхнем регистре, сделать нижним
        else if (str[i] >= 'A' && str[i] <= 'Z')
        {
            str[i] = str[i] + 32;
        }
    }
    return str;
}

int main()
{
    string str1 = "Welcome to MUO";
    cout << "Original String 1:" << endl;
    cout << str1 << endl;
    str1 = convertString(str1);
    cout << "Converted String 1:" << endl;
    cout << str1 << endl;

    string str2 = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.";
    cout << "Original String 2:" << endl;
    cout << str2 << endl;
    str2 = convertString(str2);
    cout << "Converted String 2:" << endl;
    cout << str2 << endl;

    string str3 = "Tom threw Tim three thumbtacks";
    cout << "Original String 3:" << endl;
    cout << str3 << endl;
    str3 = convertString(str3);
    cout << "Converted String 3:" << endl;
    cout << str3 << endl;

    return 0;
}

Вывод (пример):

Original String 1:
Welcome to MUO
Converted String 1:
wELCOME TO muo
Original String 2:
Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.
Converted String 2:
fUZZY wUZZY WAS A BEAR. fUZZY wUZZY HAD NO HAIR.
Original String 3:
Tom threw Tim three thumbtacks
Converted String 3:
tOM THREW tIM THREE THUMBTACKS

Альтернатива в C++: использовать std::transform вместе с ::islower/::toupper (учитывайте приведение к unsigned char для безопасного вызова функций ctype).

Python: краткое и надёжное решение

Python даёт самый короткий вариант — встроенный метод строки .swapcase(), который меняет регистр всех букв, корректно работая с некоторыми юникодными сценариями.

# Python program to convert characters of string to opposite case

# Вариант с ручной обработкой (явно):
def convertString(s):
    result = []
    for ch in s:
        if ch.islower():
            result.append(ch.upper())
        elif ch.isupper():
            result.append(ch.lower())
        else:
            result.append(ch)
    return ''.join(result)

# Короткий и рекомендуемый вариант:
# result = s.swapcase()

s1 = "Welcome to MUO"
print("Original String 1:")
print(s1)
print("Converted String 1:")
print(convertString(s1))

s2 = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair."
print("Original String 2:")
print(s2)
print("Converted String 2:")
print(convertString(s2))

s3 = "Tom threw Tim three thumbtacks"
print("Original String 3:")
print(s3)
print("Converted String 3:")
print(convertString(s3))

Вывод (пример):

Original String 1:
Welcome to MUO
Converted String 1:
wELCOME TO muo
Original String 2:
Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.
Converted String 2:
fUZZY wUZZY WAS A BEAR. fUZZY wUZZY HAD NO HAIR.
Original String 3:
Tom threw Tim three thumbtacks
Converted String 3:
tOM THREW tIM THREE THUMBTACKS

Примечание: предпочтителен s.swapcase() для компактности и часто лучшей поддержки Unicode в стандартной реализации Python.

JavaScript: строковые методы

В JavaScript можно сравнить символ с его версиями в нижнем и верхнем регистре; для поддержки Юникода потребуется дополнительные библиотеки.

// JavaScript program to convert characters of string to opposite case

function convertString(str) {
  var result = "";
  for (let i = 0; i < str.length; i++) {
    const ch = str.charAt(i);
    if (ch === ch.toLowerCase() && ch !== ch.toUpperCase()) {
      result += ch.toUpperCase();
    } else if (ch === ch.toUpperCase() && ch !== ch.toLowerCase()) {
      result += ch.toLowerCase();
    } else {
      result += ch;
    }
  }
  return result;
}

var str1 = "Welcome to MUO";
console.log("Original String 1:");
console.log(str1);
console.log("Converted String 1:");
console.log(convertString(str1));

var str2 = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.";
console.log("Original String 2:");
console.log(str2);
console.log("Converted String 2:");
console.log(convertString(str2));

var str3 = "Tom threw Tim three thumbtacks";
console.log("Original String 3:");
console.log(str3);
console.log("Converted String 3:");
console.log(convertString(str3));

Вывод в консоли будет аналогичен примерам выше.

C: простая реализация на основе ASCII

Для C-примера используется работа с массивом char и проверка диапазонов ASCII.

// C program to convert characters of string to opposite case
#include 
#include 

char* convertString(char str[])
{
    int length = strlen(str);
    for (int i = 0; i < length; i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = str[i] - 32;
        }
        else if (str[i] >= 'A' && str[i] <= 'Z')
        {
            str[i] = str[i] + 32;
        }
    }
    return str;
}

int main()
{
    char str1[] = "Welcome to MUO";
    printf("Original String 1:\n");
    printf("%s\n", str1);
    printf("Converted String 1:\n");
    printf("%s\n", convertString(str1));

    char str2[] = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.";
    printf("Original String 2:\n");
    printf("%s\n", str2);
    printf("Converted String 2:\n");
    printf("%s\n", convertString(str2));

    char str3[] = "Tom threw Tim three thumbtacks";
    printf("Original String 3:\n");
    printf("%s\n", str3);
    printf("Converted String 3:\n");
    printf("%s\n", convertString(str3));

    return 0;
}

Проверки, тесты и критерии приёмки

Критерии приёмки:

  • Для ASCII-тестов (латиница без диакритики) результат совпадает с ожидаемым.
  • Неработающие символы (цифры, пробелы, знаки препинания) не меняют своё значение.
  • Тесты покрывают пустую строку, только строчные, только заглавные, смешанный текст и строки с цифрами/знаками.

Примеры тестов:

  • “” → “”
  • “abcXYZ” → “ABCxyz”
  • “123!@#” → “123!@#”
  • “Пример“ → (зависит от реализации; на ASCII-алгоритме — без изменений)

Ограничения и когда это не сработает

  • Простые ASCII-подходы не обрабатывают Юникод: символы с диакритикой или специальные регистрозависимые правила в разных языках могут дать неверный результат.
  • Некоторые буквы (например, немецкое ß или турецкая İ/ı) требуют специфичной локали.

Рекомендации и альтернативы

  • Для задач с международными текстами используйте библиотеки Unicode (ICU) или встроенные методы языка, которые учитывают локаль.
  • В Python используйте s.swapcase() для компактного и часто корректного результата.
  • В C++ используйте и std::use_facet для локализованного преобразования или внешние библиотеки.

Быстрый чек‑лист для разработчика

  • Проверить, нужна ли поддержка Юникода.
  • Выбрать простую реализацию для ASCII или библиотечный подход для Unicode.
  • Написать юнит‑тесты на примерах выше.
  • Проверить поведение в целевой локали (если есть).

Краткое резюме

Преобразование регистра символов — простая и полезная операция. Для латиницы ASCII достаточно побуквенной обработки, но для надёжной работы с международными текстами лучше применять встроенные методы или библиотеки Unicode. Тесты и проверки на локалях помогут избежать неожиданных ошибок при реальном использовании.

Ключевые ссылки для изучения (по теме): методы строк в выбранном языке, документация ICU, заметки про локали и Unicode.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро