C/C++

С++, функция tolower не работает с кириллицей... Подскажите пожалуйста можно ли это исправить? если можно то как?

Хочу введенный текст преобразовать в нижний регистр, но функция которая для этого предназначена, при использовании типа wchar_t не работает с кириллицей.... Как быть?

#include <iostream>
#include <cctype>
using namespace std;


int main()

{
wcout.imbue(locale(".OCP"));
wcin.imbue(locale(".OCP"));

wchar_t word01[] = L"Кот";
wchar_t c;

for (int i = 0; i <= wcslen(word01) - 1; i++) {
c = word01[i];
wcout << (wchar_t)tolower(c) << endl;
}

return 0;
}


По итогу мой код вместо нижнего регистра с буквами кириллицы выдает иероглифы
Пиши свою пользовательскую функцию tolower() для wchar_t:

#include<stdio.h>
#include<wchar.h>
#include<wctype.h>
#include<locale.h>
#include<stdlib.h>
wchar_t abc[]=
L"абвгдеёжзийклмнопрстуфхцчшщьыъэюя";
wchar_t ABC[]=
L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
wchar_t word[256]={0};

wchar_t* wtolower(wchar_t *wstr)
{
for(int j = 0; j < wcslen(wstr); j++)
{//for j
if(wcschr(ABC,wstr[j]))
{//if
wchar_t symbol=L'0';
wcsncpy(&symbol,wcschr(ABC,wstr[j]),1);
for(int i = 0; i < wcslen(ABC);i++)
{//for i
if(ABC[i] == symbol)
wstr[j] = abc[i];
}//for i
}//if
}//for j
return wstr;
}

int main()
{
setlocale(LC_ALL,"Russian");
wprintf(L"Введите слово:\n");
wscanf(L"%ls",&word);
wprintf(L"\nРезультат преобразования:\n%ls",wtolower(word));
system("pause"); //для Винды
return 0;
}
Андрей Волкивской
Андрей Волкивской
37 945
Лучший ответ
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

void ru();
void ru_lower(wstring&);
void ru_upper(wstring&);
wchar_t wchar_to_lower(wchar_t);
wchar_t wchar_to_upper(wchar_t);

int main() {
ru();
wstring cat = L"КОТ";
wcout << cat << L'\n';
ru_lower(cat);
wcout << cat << L'\n';
wchar_t dog[] = L"СОБАКА";
wcout << dog << L'\n';
for (int i = 0; dog[i]; ++i) dog[i] = wchar_to_lower(dog[i]);
wcout << dog << L'\n';
system("pause > nul");
}

void ru() {
wcout.imbue(locale(".866"));
wcin.imbue(locale(".866"));
}

void ru_lower(wstring& rus) {
transform(rus.begin(), rus.end(), rus.begin(), ::wchar_to_lower);
}

void ru_upper(wstring& rus) {
transform(rus.begin(), rus.end(), rus.begin(), ::wchar_to_upper);
}

wchar_t wchar_to_lower(wchar_t symbol) {
_locale_t rus = _wcreate_locale(LC_CTYPE, L"Russian_Russia.1251");
return _towlower_l(symbol, rus);
}

wchar_t wchar_to_upper(wchar_t symbol) {
_locale_t rus = _wcreate_locale(LC_CTYPE, L"Russian_Russia.1251");
return _towupper_l(symbol, rus);
}
В С++ локализованная версия функции tolower определена в заголовочном файле <locale>

Ищи и читай: C++ функция tolower.
Даниил Djabbarkulov
Даниил Djabbarkulov
84 019
tolower предназначена для работы с короткими строками, для Unicode есть свой собственный набор функций, в частности _wcslwr
Rustamjon Ahunjanov
Rustamjon Ahunjanov
30 155