0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 9
1

Ошибка при работе с текстом

13.05.2020, 19:35. Показов 1020. Ответов 9
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Столкнулся с проблемой, которую не могу решить уже не первый день. Задача такая - задан текст, из этого текста нужно взять слова и поместить их в массив, сортируя по количеству слогов в слове. Ну, вроде задача несложная. Написал код, протестировал с 2 маленькими предложениями и всё заработало, но когда я взял текст побольше, программа сломалась. Выбивает ошибку и я не знаю как мне её убрать. Помогите пожалуйста!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <Windows.h>
#include <string>
#include <locale>
#include <iostream>
#include <fstream>
 
using namespace std;
 
bool IsVowel(char symbol);
int Syllable(string word);
void FileWork(char* file_place, int size, string* parr);
void FileInput(char* file_place, string* parr);
 
 
int main()
{   
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    setlocale(0, "");
    setlocale(LC_ALL, "RUS");
 
    char file_input[] = "D:\\C++\\result.txt";
 
    char text[] = "Прошло знойное лето. Наступила золотая осень."
        "Загляни в лес.По опушкам растут грибы. Среди пожухлой травы краснеют подосиновики."
        "По краю ельника можно найти скользкие грузди, душистые рыжики. Старые пни покрыты опёнками."
        "Моховые болота усыпаны румяной клюквой. На поляне горят гроздья рябины. Дни стоят погожие.";
    cout << sizeof(text) << endl;
    int size = sizeof(text);
    char* ptext = text;
 
    string arr[6];
    string* parr = arr;
 
    FileWork(ptext, size, parr);
    
    char* file_place = file_input;
    FileInput(file_place, parr);
}
const char vowels[] = { 'а', 'е', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я' }; //гласные буквы рус
const char signs[] = { '.', ',', ':', '...', ';', '?', '!', ' '}; //знаки препинания
 
bool IsVowel(char symbol) //проверка символа symbol на то, что это гласная буква
{
    for (int i = 0; i < 9; i++)
        if (symbol == vowels[i]) return true;
    return false;
}
 
bool IsSign(char symbol) //проверка символа на то, что это знак препинания
{
    for (int i = 0; i < 8; i++)
        if (symbol == signs[i]) return true;
    return false;
}
 
int Syllable(string word) //подсчёт числа слогов в слове
{
    int number_of_syllables = 0;
    for (int i = 0; i < word.length(); i++)
        if (IsVowel(word[i])) number_of_syllables++;
    return number_of_syllables;
}
 
void FileWork(char* text, int size, string* parr)
{
    string temp_word;
 
    for(int i = 0; i < size; i++)
    {
        if (IsSign(text[i]))
        {
            if (temp_word != " ")
            {
                int number_of_syllables = Syllable(temp_word);
                parr[number_of_syllables - 1] += temp_word;
                parr[number_of_syllables - 1] += ", ";
            }
            temp_word = "";
        }
        else
        {
            temp_word += text[i];
        }
    }
}
 
void FileInput(char* file_place, string* parr)
{
    fstream file;
    file.open(file_place);
    for(int i = 0; i < 5; i++)
    {
        parr[i] += ";";
        file << parr[i] << endl;
    }
    file.close();
}
Миниатюры
Ошибка при работе с текстом  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2020, 19:35
Ответы с готовыми решениями:

Аппаратная ошибка видео (Ошибка при работе с видеоустройствами привела к некорректной работе Windows).
Аппаратная ошибка видео. Последнее время во время игры Call of Duty: Modern Warfare 2 в...

При работе с большим текстом программа перестаёт работать
Подскажите пожалуйста в чём ошибка? Данная программа считывает текст из документа и помещает этот...

Проблемы с русским текстом при работе с FM20.dll.
При работе с FM20.dll возникла проблема: кирилический текст в ComboBox и TextBox вводится в виде...

Ошибка при использовании ADODB.CONNECTION при работе с dbf-файлом
Добрый день! Написала макрос с использованием adodb.connection. макрос удаляет строки из файла dbf....

9
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.05.2020, 19:42 2
Цитата Сообщение от AndreyVoiteshik Посмотреть сообщение
Выбивает ошибку и я не знаю как мне её убрать
На скрине тоже ваш код?
0
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 9
13.05.2020, 19:57  [ТС] 3
valen10, на скрине то, что выбивает мне visual studio про запуске моего кода
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.05.2020, 19:57 4
После строки 75 пишите:
C++
1
2
3
if (temp_word.empty()) {
    cout << "Ахтунг\n";
}
Ставьте точку останова на строку внутри блока if, запускайте отладчик и ищите ошибку.
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.05.2020, 19:59 5
Цитата Сообщение от AndreyVoiteshik Посмотреть сообщение
на скрине то, что выбивает мне visual studio про запуске моего кода
Пользы от этого ноль. Нужно было открыть стек вызовов и искать там точку в своей программе, откуда сюда был вызов.
Ошибка при работе с текстом
0
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 9
13.05.2020, 20:00  [ТС] 6
valen10, Ахтунг написало один раз и выкинуло ошибку. Я разбирал код пошагово сразу, когда столкнулся с этим, но так и не понял в чём ошибка
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.05.2020, 20:03 7
Лучший ответ Сообщение было отмечено AndreyVoiteshik как решение

Решение

Цитата Сообщение от AndreyVoiteshik Посмотреть сообщение
но так и не понял в чём ошибка
Пустая строка там, где должно быть слово, у пустой строки слогов number_of_syllables = 0, parr[number_of_syllables - 1] - выход за границы.
1
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 9
13.05.2020, 20:16  [ТС] 8
valen10, сейчас попробую как-то исправить, скорее всего дело именно в этом

Добавлено через 11 минут
valen10, исправил и всё работает!!! Я думал, что предусмотрел вариант с пустой строкой, но сделал это криво. Ещё при исправлении первой ошибки обнаружил новую - когда в тексте встречалась просто буква, допустим "в", это не было пустой строкой, но количество гласных равнялось нулю. Спасибо Вам огромное!)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void FileWork(char* text, int size, string* parr)
{
    string temp_word;
 
    for(int i = 0; i < size; i++)
    {
        if (IsSign(text[i]))
        {
            if (!temp_word.empty())
            {
                int number_of_syllables = Syllable(temp_word);
                if (number_of_syllables != 0)
                {
                    parr[number_of_syllables - 1] += temp_word;
                    parr[number_of_syllables - 1] += ", ";
                }
            }
            temp_word = "";
        }
        else
        {
            temp_word += text[i];
        }
    }
}
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.05.2020, 20:25 9
Цитата Сообщение от AndreyVoiteshik Посмотреть сообщение
if (!temp_word.empty())
Это не будет избыточным? Далее еще есть проверка if (number_of_syllables != 0).
И другая сторона такой модификации: слова из одной согласной никуда не относятся?
0
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 9
13.05.2020, 20:47  [ТС] 10
valen10, Вы правы. Я изначально добавил две проверки Вопрос хороший, можно такие слова выводить отдельно, но думаю это не предусматривалось в задании
0
13.05.2020, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2020, 20:47
Помогаю со студенческими работами здесь

Логическая ошибка при выполнении простой модели при работе с очередями с использованием приоритетов
Здравствуйте уважаемые форумчане! работаю в Anylogic 7.0. При построении простой системы массового...

Не является внутренней или внешней командой - ошибка не при компиляции а при работе программы
В VS скомпилировал код #include &lt;iostream&gt; using namespace std; int main() { int a;...

Ошибка при работе с ComboBox при использовании FindComponent
Есть комбобокс, список в него загружается из стринггрида. Потом по выбранному значению в комбобоксе...

Ошибка при построении запроса к БД при работе с dateTimePicker
Выдает ошибку при построении запроса в аксессе 2003. Раньше не работал с dateTimePicker и поэтому...

Ошибка при работе с If
Добрый день, помогите разобраться с If, есть процедура нажатия кнопки, при которой происходит...

Ошибка при работе
В общем запускаю Mirror's Edge на вин7 с параметрами 1600х900, картинка и текстуры средние,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru