удалить из строки русские буквы

183
12 декабря 2017, 19:43

Имеется строка:

string str = { "hey, Johnny, how is твои дела?" };

нужно избавиться от "русского хвоста". Делаю так, но почему-то строка остается неизменной

void delRussian(string& str)
{
    auto i = find_if(str.begin(), str.end(), [](char& a) {
        return a >= 128;//начало русских букв в ASCII
    });
    str.erase(i, str.end());
}

Пробовал и так

void delRussian(string& str)
{
    auto i = find_if(str.begin(), str.end(), [](char& a) {
        return (a >= 'А' && a <= 'ё');//начало русских букв в ASCII
    });
    str.erase(i, str.end());
}

Ни в какую.

Answer 1

Подозреваю, что char в вашей системе - знаковый. В таком случае условие a >= 128 никогда не сработает (ибо максимальное целое число, представимое char в таком случае - 127).

Предлагаю такую модификацию:

void delRussian(string& str)
{
    auto i = find_if(str.begin(), str.end(), [](char& a) {
        return static_cast<unsigned char>(a) >= 128;//начало русских букв в ASCII
    });
    str.erase(i, str.end());
}

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

Или можно преобразовать условие к такому:

!(a > 0 && a <= 127)

READ ALSO
Не работает код, возврат функции, C++

Не работает код, возврат функции, C++

При компиляции открывается консоль, которая выводит два отрицательных восьмизначных числаЧто не так?

236
Проблема с очередью на с++ [требует правки]

Проблема с очередью на с++ [требует правки]

Пишу очередь с приоритетамиВозникла проблема

192
Ошибка &ldquo;on a null object reference&rdquo; при работе с Room

Ошибка “on a null object reference” при работе с Room

Пытаюсь получить доступ к уже существующей bd через Room, но при выполнении кода просходит ошибка

300