Обрубка русского текста

222
05 декабря 2017, 21:21

Пытаюсь вывести предложение с указанным искомым словом, но программа не выводит полностью всё предложение, а лишь часть текста.

    while (1)
{
    int begining_pos = text.find(search); // начало строки
    int crt_pos;                          // текущая позиция
    crt_pos = text.find(search); // ищу позицию искомого слова
    if (crt_pos == -1)
        break;
        // если предложений с таким словом нет, 
                                  // то выхожу из цикла
                                  // ищу начало строки
    for (int i = crt_pos; ; i--)
    {
        if (text[i] != '!' && text[i] != '.' && text[i] != '?' && i != 0)
            begining_pos--;
        else
        {
            crt_pos = i;
            if (crt_pos > 0)
                begining_pos++; // начало строки
            break;
        }
    }
    // записываю строку
    for (crt_pos = begining_pos; ; crt_pos++)
    {
        if (text[crt_pos] == '!' || text[crt_pos] == '.' || text[crt_pos] == '?' || (int)text[crt_pos] == -1)
        {
            result += text[crt_pos];
            break;
        }
        if (crt_pos == begining_pos && text[crt_pos] == ' ') continue;
        result += text[crt_pos]; // записал строку в 'result'
    }
    // вывожу результат
    cout << result << endl << endl;
    text.erase(begining_pos, crt_pos + 1); // удаляю из текста найденую строку
    result = ""; // очищаю результат
}

Вот пример:

SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
string text = ""; // текст записанный из файла
string search;    // искомое слово
string result;    // результат поиска
string filename = "rus.txt"; // имя файла
                              // файл в котором будет осуществляться поиск
ifstream *in = new ifstream(filename.data());
if (in->fail())
{
    cout << "Файл '" << filename << "' не найден! " << endl << endl;
    system("pause");
    return 1;
}
// пользователь вводит искомое слово
cout << "Введите искомое слово: ";
cin >> search;
// записываю содержимое файла
if (in->is_open())
{
    while (!in->eof())
        text += in->get();
    in->close();
}
delete in;

Вот описание всех строк и начало программы.

Answer 1

ASCII "я" в cp1251 имеет код 255, что тождественно -1 в signed char

Вы можете сравнивать crt_pos с длиной строки, например

READ ALSO
Многооконное приложение в QML

Многооконное приложение в QML

Добрый деньИмеется основная форма (ApplicationWindow), на которой есть активный элемент

280
boost::variant boost::apply_visitor

boost::variant boost::apply_visitor

Как используется boost::variant (в частности apply_visitor)?

232
Распределение памяти в функции C++

Распределение памяти в функции C++

Имеется такая функция

202