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

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

4 min read Программирование Обновлено 06 Jan 2026
Поменять регистр всех символов строки
Поменять регистр всех символов строки

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

Задача

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

Примеры:

  • Пример 1: str = “Welcome to MUO”

    Результат: “wELCOME TO muo”

  • Пример 2: str = “Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.”

    Результат: “fUZZY wUZZY WAS A BEAR. fUZZY wUZZY HAD NO HAIR.”

  • Пример 3: str = “Tom threw Tim three thumbtacks”

    Результат: “tOM THREW tIM THREE THUMBTACKS”

См. также: проверка, являются ли две строки анаграммами.

Краткая стратегия

  • Для ASCII-символов можно использовать арифметику кодов (например, добавить/вычесть 32 в C/C++/C) или стандартные функции библиотек.
  • В современных приложениях лучше пользоваться встроенными методами (Python: swapcase(), C++: std::toupper/ std::tolower с учётом локали, JavaScript: toUpperCase()/toLowerCase()).
  • Всегда учитывайте кодировку (UTF-8) и локаль: некоторые символы в Unicode изменяют длину или поведение при преобразовании (например, турецкое i).

Когда простой подход не сработает (важные оговорки)

Важно: методы, которые работают на ASCII, не покрывают все случаи Unicode. Особые моменты:

  • Турецкий язык: ‘i’ ↔ ‘İ’ и ‘I’ ↔ ‘ı’ — простое приведение к верхнему/нижнему регистру может дать неожиданные результаты без учёта локали.
  • Символы с диакритикой и комбинирующие знаки могут вести себя иначе при нормализации (NFC/NFD).
  • Некоторые символы в Unicode при смене регистра превращаются в несколько кодовых точек (например, немецкий ß → SS в некоторых преобразованиях).

Совет: для корректной работы с пользовательским вводом используйте библиотечные функции с поддержкой локали или Unicode-aware библиотеки.

Быстрые характеристики (факт-бокс)

  • Время: O(n), где n — длина строки.
  • Память: O(1) дополнительной памяти при преобразовании «на месте», иначе O(n) при создании новой строки.
  • Поддержка: стандартные библиотеки большинства языков покрывают базовый набор задач по смене регистра.

Подходы и примеры кода

Ниже — примеры программ на популярных языках. Код сохранён в оригинальном виде; комментарии и пояснения даны в тексте.

C++

Ниже — C++-пример, который преобразует регистр для ASCII-символов, меняя коды символов на 32 при необходимости.

// C++ program to convert characters of string to opposite case  
#include   
using namespace std;  
  
string convertString(string& str)  
{  
 int length = str.length();  
 for (int i = 0; i < length; i++)  
 {  
 // If the character is in lowercase,  
 // convert it to uppercase  
 if (str[i] >= 'a' && str[i] <= 'z')  
 {  
 str[i] = str[i] - 32;  
 }  
 // If the character is in uppercase,  
 // convert it to lowercase  
 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;  
}

Примечание: этот пример корректен для ASCII-латиницы; для многобайтовых кодировок рекомендуется использовать библиотеки, поддерживающие Unicode.

Python

Python предлагает простой и безопасный инструмент: str.swapcase() — он учитывает Unicode‑символы на уровне Python.

# Python program to convert characters of string to opposite case  
def convertString(str):  
    length = len(str)  
    result = ""  
    for i in range(length):  
        # If the character is in lowercase,  
        # convert it to uppercase  
        if str[i].islower():  
            result += str[i].upper()  
        # If the character is in uppercase,  
        # convert it to lowercase  
        elif str[i].isupper():  
            result += str[i].lower()  
        else:  
            result += str[i]  
    return result  
  
  
str1 = "Welcome to MUO"  
print("Original String 1:")  
print(str1)  
print("Converted String 1:")  
print(convertString(str1))  
  
str2 = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair."  
print("Original String 2:")  
print(str2)  
print("Converted String 2:")  
print(convertString(str2))  
  
str3 = "Tom threw Tim three thumbtacks"  
print("Original String 3:")  
print(str3)  
print("Converted String 3:")  
print(convertString(str3))  

Короткая альтернатива в Python: str.swapcase() — готовый метод, который меняет регистр у всех букв.

JavaScript

В JavaScript можно пройти по символам и сравнивать их с верхним/нижним вариантом. Учтите: toUpperCase()/toLowerCase() зависят от реализаций движка и локали.

// JavaScript program to convert characters of string to opposite case  
  
function convertString(str) {  
 var length = str.length;  
 var result = "";  
 for (let i = 0; i < str.length; i++) {  
 // If the character is in lowercase,  
 // convert it to uppercase  
 if (str.charAt(i) === str.charAt(i).toLowerCase()) {  
 result += str.charAt(i).toUpperCase();  
 // If the character is in uppercase,  
 // convert it to lowercase  
 } else if (str.charAt(i) === str.charAt(i).toUpperCase()) {  
 result += str.charAt(i).toLowerCase()  
 } else {  
 result += str.charAt(i);  
 }  
 }  
 return result;  
}  
  
var str1 = "Welcome to MUO";  
document.write("Original String 1:" + "  \n");  
document.write(str1 + "  \n");  
str1 = convertString(str1);  
document.write("Converted String 1:" + "  \n");  
document.write(str1 + "  \n");  
  
var str2 = "Fuzzy Wuzzy was a bear. Fuzzy Wuzzy had no hair.";  
document.write("Original String 2:" + "  \n");  
document.write(str2 + "  \n");  
str2 = convertString(str2);  
document.write("Converted String 2:" + "  \n");  
document.write(str2 + "  \n");  
  
var str3 = "Tom threw Tim three thumbtacks";  
document.write("Original String 3:" + "  \n");  
document.write(str3 + "  \n");  
str3 = convertString(str3);  
document.write("Converted String 3:" + "  \n");  
document.write(str3 + "  \n");

C

C‑пример использует сравнение кодов символов и арифметику. Будьте внимательны: в C функции из ожидают аргумент типа unsigned char или EOF.

// C program to convert characters of string to opposite case  
#include   
#include   
#include   
  
const char* convertString(char str[])  
{  
 int length = strlen(str);  
 for (int i = 0; i < length; i++)  
 {  
 // If the character is in lowercase,  
 // convert it to uppercase  
 if (str[i] >= 'a' && str[i] <= 'z')  
 {  
 str[i] = str[i] - 32;  
 }  
 // If the character is in uppercase,  
 // convert it to lowercase  
 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", 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", 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", convertString(str3));  
  
return 0;  
}

Альтернативные подходы

  • Использовать функции стандартной библиотеки: Python — swapcase(), C/C++ — std::tolower/std::toupper в сочетании со std::locale, JavaScript — toLowerCase/toUpperCase.
  • Для Unicode‑корректности применять специализированные библиотеки: ICU (C/C++), java.text/Locale в Java, или сторонние npm-пакеты для JS.
  • Для потоковой обработки больших текстов — читать по кускам и обрабатывать буферами, чтобы не держать всю строку в памяти.

Психологическая модель (как думать о задаче)

Представьте каждую букву как элемент, имеющий 3 состояния: заглавная, строчная, небуквенный символ. Задача — пройтись по массиву символов и переключить состояние только для букв. Если среда — ASCII, переключение — простая арифметика. Если среда — Unicode, переключение — вызов «умной» функции, возможно зависящей от локали.

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

Тесты, которые должны проходить:

  1. Английский текст с комбинированными регистрами (пример выше).
  2. Текст с цифрами и знаками пунктуации — они должны остаться без изменений.
  3. Пустая строка — вернуть пустую строку.
  4. Unicode-строки (например, немецкий ß, турецкий i) — поведение должно быть задокументировано и согласовано с требованиями локали.

Тестовые случаи (примеры)

  • Input: “Hello123” → Output: “hELLO123”
  • Input: “” → Output: “”
  • Input: “İstanbul” (турецкий) — проверьте в вашей локали
  • Input: “straße” → ожидаемое поведение зависит от правил приведения регистра

Контроль качества и безопасность

  • Валидируйте входные кодировки (ожидаемый UTF-8). Некорректная кодировка может привести к неверным результатам или ошибкам.
  • Не используйте небезопасные приведения char → int без приведения к unsigned char, если применяете функции в C.

Чек-лист для ролей

  • Разработчик: использовать встроенные средства языка; обеспечить юнит‑тесты на ASCII и Unicode; обработать пустые и большие строки.
  • Ревьюер: проверить использование локали/Unicode, отсутствие UB (undefined behavior) в C/C++ и корректность работы в разных локалях.
  • Тестировщик: запустить набор тестов из раздела «Тестовые случаи», добавить стресс‑тесты для больших строк.

Краткая сводка

Вы узнали несколько способов поменять регистр букв в строке: простая арифметика для ASCII, встроенные методы и функции стандартных библиотек для корректной работы с Unicode и локалями. Выберите подход в зависимости от целевой аудитории текста и требований к локали.

Примечание: Python хорош для быстрой разработки и корректно работает с Unicode по умолчанию.

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

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство