Палиндром в русских буквах

Требуется определить является ли строка палиндромом или нет. Фраза называется палиндромом (перевертышем), если после удаления пробелов и замены всех букв на заглавные она читается одинаково, как слева направо, так и справа налево. Мой код работает, но только через латинские буквы, а надо чтобы через русские тоже, как исправить?


#include <iostream>
using namespace std;

int main()
{
   string s, s1="";
   getline(cin, s);
   for(int i=0; i<s.size(); i++){
       if(s[i]==' ')
       s.erase(i,1);
       s[i]=toupper(s[i]);
   }
   for(int i=s.size()-1; i>=0; i--)
   {
      s1+=s[i];
   }
   if(s==s1)
   cout<<"YES";
   else cout<<"NO";
}

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

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

toupper не верно работает с Кириллицей.

Чтобы не возиться с представлением символов могу предложить следующий вариант:

#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
#include <algorithm>

int main()
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring s, s1 = L"";
    std::getline(std::wcin, s);

    s.erase(remove(s.begin(), s.end(), L' '), s.end());

    std::transform(s.begin(), s.end(), s.begin(), [](wchar_t c) -> wchar_t { return std::toupper(c, std::locale()); });

    for (int i = s.size() - 1; i >= 0; i--)
    {
        s1 += s[i];
    }

    if (s == s1)
        std::wcout << L"YES";
    else
        std::wcout << L"NO";
}
→ Ссылка