Работа с русскими символами в С++

Помогите решить проблему, я не так уж много знаю С++, и мы дали такую ​​задачу: "подаётся строка, нужно в этой строке найти самое длинное слово, развернуть его, а во всех остальных поменять регистр" можно вводить русские и английские символы с цифрами. , нельзя использовать строку а только массив char. Сложность для меня заключалась в том, что я мало работал со таблицами символов, помогите, пожалуйста.

Я пробовал использовать стандартные библиотеки, но с русскими символами ничего не получилось. Так же пробовал со сменой, но ничего не работает


Ответы (1 шт):

Автор решения: Elizabeth

Не все компиляторы С++ правильно обрабатывают русские символы, потому что:

  1. Многие компиляторы и среды разработки используют кодировку по умолчанию, которая может не поддерживать русские символы.

  2. Если локаль не установлена или установлена неправильно, компилятор может не распознавать русские символы. Например, использование setlocale(LC_ALL, ""); и locale::global(locale("")); помогает установить правильную локаль.

  3. Не все библиотеки поддерживают 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;
}

→ Ссылка