Работа с русскими символами в С++
Помогите решить проблему, я не так уж много знаю С++, и мы дали такую задачу: "подаётся строка, нужно в этой строке найти самое длинное слово, развернуть его, а во всех остальных поменять регистр" можно вводить русские и английские символы с цифрами. , нельзя использовать строку а только массив char. Сложность для меня заключалась в том, что я мало работал со таблицами символов, помогите, пожалуйста.
Я пробовал использовать стандартные библиотеки, но с русскими символами ничего не получилось. Так же пробовал со сменой, но ничего не работает
Ответы (1 шт):
Не все компиляторы С++ правильно обрабатывают русские символы, потому что:
Многие компиляторы и среды разработки используют кодировку по умолчанию, которая может не поддерживать русские символы.
Если локаль не установлена или установлена неправильно, компилятор может не распознавать русские символы. Например, использование
setlocale(LC_ALL, "");
иlocale::global(locale(""));
помогает установить правильную локаль.Не все библиотеки поддерживают Unicode, поэтому возникают проблемы при работе с многобайтовыми символами (русские буквы). Нужно использовать "широкие" (двухбайтовые) символы
(std::wchar_t)
и функции для работы с широкими строками(iswlower, towupper)
#include <iostream>
#include <locale>
#include <string>
#include <algorithm>
using namespace std;
// Функция для проверки, является ли символ буквой (английской или русской)
bool isLetter(wchar_t c) {
return (c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z') || // Английские буквы
(c >= L'А' && c <= L'я'); // Русские буквы
}
// Функция для реверса подстроки в строке
void reverse(wchar_t str[], int start, int end) {
while (start < end) {
swap(str[start], str[end]); // Меняем местами символы
start++;
end--;
}
}
int main() {
// Устанавливаем локаль для корректной работы с русскими символами
setlocale(LC_ALL, "");
locale::global(locale(""));
wchar_t str[100];
wcout << L"Введите строку: ";
wcin.getline(str, 100);
int start = 0, end = 0, maxLength = 0, maxStart = 0;
// Проходим по всей строке
for (int i = 0; str[i] != L'\0'; i++) {
if (isLetter(str[i])) {
end = i; // Если символ - буква, обновляем конец текущего слова
} else {
// Если символ не буква, проверяем длину текущего слова
if (end - start + 1 > maxLength) {
maxLength = end - start + 1; // Обновляем максимальную длину слова
maxStart = start; // Обновляем начало самого длинного слова
}
start = i + 1; // Обновляем начало следующего слова
}
}
// Проверка последнего слова
if (end - start + 1 > maxLength) {
maxLength = end - start + 1;
maxStart = start;
}
// Реверс самого длинного слова
reverse(str, maxStart, maxStart + maxLength - 1);
// Изменение регистра букв
for (int i = 0; str[i] != L'\0'; i++) {
if (isLetter(str[i])) {
str[i] = iswlower(str[i]) ? towupper(str[i]) : towlower(str[i]);
}
}
wcout << L"Результат: " << str << endl;
return 0;
}