Поменять регистр всех символов строки
Задача
Дана строка. Нужно преобразовать все буквенные символы этой строки в противоположный регистр.
Примеры:
Пример 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 функции из
// 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, переключение — вызов «умной» функции, возможно зависящей от локали.
Критерии приёмки
Тесты, которые должны проходить:
- Английский текст с комбинированными регистрами (пример выше).
- Текст с цифрами и знаками пунктуации — они должны остаться без изменений.
- Пустая строка — вернуть пустую строку.
- 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 по умолчанию.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone