#include <iostream>
#include <vector>
#include <locale>
#include <sstream>
struct ctype_russian : std::ctype<char>
{
static const mask* make_table()
{
static std::vector<mask> v{classic_table(), classic_table() + table_size};
for(char c: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
v[(unsigned char)c] &= ~alpha;
v[(unsigned char)c] |= space;
}
for(char c: "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ") {
v[(unsigned char)c] |= alpha;
v[(unsigned char)c] &= ~space;
}
return &v[0];
}
ctype_russian(std::size_t refs = 0) : ctype(make_table(), false, refs) {}
};
int main()
{
std::string in = "English words Русские слова English again";
std::istringstream s(in);
s.imbue(std::locale(s.getloc(), new ctype_russian()));
std::string token;
while (s >> token)
std::cout << " " << token << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bG9jYWxlPgojaW5jbHVkZSA8c3N0cmVhbT4KCnN0cnVjdCBjdHlwZV9ydXNzaWFuIDogc3RkOjpjdHlwZTxjaGFyPgp7CiAgICBzdGF0aWMgY29uc3QgbWFzayogbWFrZV90YWJsZSgpCiAgICB7CiAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPG1hc2s+IHZ7Y2xhc3NpY190YWJsZSgpLCBjbGFzc2ljX3RhYmxlKCkgKyB0YWJsZV9zaXplfTsKICAgICAgICBmb3IoY2hhciBjOiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpIHsKICAgICAgICAgICAgdlsodW5zaWduZWQgY2hhciljXSAmPSB+YWxwaGE7CiAgICAgICAgICAgIHZbKHVuc2lnbmVkIGNoYXIpY10gfD0gIHNwYWNlOwogICAgICAgIH0KICAgICAgICBmb3IoY2hhciBjOiAi0LDQsdCy0LPQtNC10ZHQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0JDQkdCS0JPQlNCV0IHQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCvIikgewogICAgICAgICAgICB2Wyh1bnNpZ25lZCBjaGFyKWNdIHw9ICBhbHBoYTsKICAgICAgICAgICAgdlsodW5zaWduZWQgY2hhciljXSAmPSB+c3BhY2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAmdlswXTsKICAgIH0KICAgIGN0eXBlX3J1c3NpYW4oc3RkOjpzaXplX3QgcmVmcyA9IDApIDogY3R5cGUobWFrZV90YWJsZSgpLCBmYWxzZSwgcmVmcykge30KfTsKCmludCBtYWluKCkKewogICAgc3RkOjpzdHJpbmcgaW4gPSAiRW5nbGlzaCB3b3JkcyDQoNGD0YHRgdC60LjQtSDRgdC70L7QstCwIEVuZ2xpc2ggYWdhaW4iOwogICAgc3RkOjppc3RyaW5nc3RyZWFtIHMoaW4pOwogICAgcy5pbWJ1ZShzdGQ6OmxvY2FsZShzLmdldGxvYygpLCBuZXcgY3R5cGVfcnVzc2lhbigpKSk7CiAgICBzdGQ6OnN0cmluZyB0b2tlbjsKICAgIHdoaWxlIChzID4+IHRva2VuKQogICAgICAgIHN0ZDo6Y291dCA8PCAiICAiIDw8IHRva2VuIDw8ICdcbic7Cn0K