@dmitrii000

Ошибка в подсчете символов, что делать?

есть код, который должен из текста, который пишет пользователь, считать количество русских букв, однако он не правильно это делает, что не так?
#include <iostream>
#include <string>
#include <vector>

int main() {
    setlocale(LC_ALL, "RU");
    std::string input;
    std::vector<char> charVector;
    int count = 0;

    std::cout << "ctrl + z 4 end read" << std::endl;

    std::string line;
    while (std::getline(std::cin, line)) {
        input += line;
    }

    for (char c : input) {
        charVector.push_back(c);
    }

    for (int i = 0; i < charVector.size(); i++) {
        if (charVector[i] == 'а' || charVector[i] == 'б' || charVector[i] == 'в' || charVector[i] == 'г' || charVector[i] == 'д' ||
            charVector[i] == 'е' || charVector[i] == 'ё' || charVector[i] == 'ж' || charVector[i] == 'з' || charVector[i] == 'и' ||
            charVector[i] == 'й' || charVector[i] == 'к' || charVector[i] == 'л' || charVector[i] == 'м' || charVector[i] == 'н' ||
            charVector[i] == 'о' || charVector[i] == 'п' || charVector[i] == 'р' || charVector[i] == 'с' || charVector[i] == 'т' ||
            charVector[i] == 'у' || charVector[i] == 'ф' || charVector[i] == 'х' || charVector[i] == 'ц' || charVector[i] == 'ч' ||
            charVector[i] == 'ш' || charVector[i] == 'щ' || charVector[i] == 'ъ' || charVector[i] == 'ы' || charVector[i] == 'ь' ||
            charVector[i] == 'э' || charVector[i] == 'ю' || charVector[i] == 'я') {
            count++;
        }
    }

    std::cout << "count rusbukv " << count << std::endl;

    return 0;
}
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Для кодирования символов за пределами таблицы ASCII, обычно, используется юникод, в котором символы имеют коды различной длины. Кириллица же, никак не уместится в один байт, поэтому у вас в векторе абсолютный мусор.
Используйте wchar и wstring
Или не мучайтесь и возьмите библиотеку, например, эту
https://github.com/nemtrif/utfcpp

Ссылка на таблицу символов юникод для ознакомления
https://symbl.cc/en/unicode/table/#cyrillic
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
считать количество русских букв, однако он не правильно это делает, что не так?

считать русские буквы сложно, твой код зависит от кодировки и в любой не-однобайтной кодировке этот код не будет работать правильно. Проще всего, мне кажется, выкинуть charVector и весь код связанный с ним, а оставшееся переписать следующим образом:
setlocale(LC_ALL, "");

const char *str = input.c_str();

while (*str) {
    wchar_t c;
    int n = mbtowc(&c, str, MB_CUR_MAX);

    if (n < 0)
        break;
    if (wcschr(L"абвгд...юя", c))
        ++count;
    str += n;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы