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

Введение
Строка — это последовательность символов. Часто требуется поменять регистр каждого символа на противоположный: буквы в верхнем регистре сделать нижними и наоборот. Это простая операция для 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.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента