Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 7
1

Задачка с расщеплением строки. Ошибка отладки

25.03.2016, 00:12. Просмотров 526. Ответов 5
Метки нет (Все метки)

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
100
101
102
103
104
105
106
107
// Ch5_05.cpp
// Напишите функцию, которая, получив строку, состоящую из слов,
// разделенных пробелами, возвращает первое слово; следующий ее вызов с
// аргументом null должен вернуть второе слово и так далее до тех пор,
//  пока вся строка не будет успешно обработана, и тогда должно быть
// возвращено значение null.
 
#include <iostream>
 
using std::cout;
using std::cin;
 
char* split(char* str);
 
char null[] = "";
 
int main(void)
{
 
    // Обрабатываемая строка
    char line[] = "january february march";
 
        // Строка для хранения отдельных слов
    char* line_aux(nullptr);
 
    int count = 1;                  // Счетчик
 
    for (;;)
    {
        if (1 == count)
            line_aux = split(line);
        else
            line_aux = split(null);
 
        if (line_aux == null)
        {
            delete[] line_aux;
            line_aux = nullptr;
            break;
        }
        
        // Вывод на экран очередного слова
        cout << "#" << count << ": " << line_aux << "\n\n";
 
        delete[] line_aux;
        line_aux = nullptr;
 
        count++;
    }
 
    return 0;
}
 
// Функция для возврата слова из строки
char* split(char str[])
{
    static char* saved_str = str;   // Строка сохраняется в статической
                                    // переменной при первом вызове функции
    
 
                                    // количество символов в строке
    static int quant = static_cast<int>(strlen(str));
 
    static int num = 0;             // Статическая переменная для
                                    // подсчета символов
 
    // Номер символа конца предыдущего слова
    static int num_former = 0;
    
    // Выделение динамической памяти под очередное слово
    char* word(nullptr);
    word = new char[quant];
 
    while ((*(saved_str + num) != ' ') && (*(saved_str + num) != '\0'))
    {
        // Каждый раз в массив word нужно записывать с нулевой позиции
        *(word + (num - num_former)) = *(saved_str + num);
        num++;
    }
 
    // Флаг окончания строки
    static bool flag = false;
 
    if (*(saved_str + num) == ' ')
    {
        // Обозначаем конец строки, содержащей очередное слово
        *(word + (num - num_former)) = '\0';
        num++;
        // Сохраняем текущую позицию символа
        num_former = num;
    }
 
        // Если конец строки достигается впервые, то передаем последнее
        // слово. В противном случае возвращаем функции null - признак
        // окончания строки.
    else if (*(saved_str + num) == '\0')
    {
        if (!flag)
        {
            flag = true;
            *(word + (num - num_former)) = '\0';
        }
        else        word = null;
    }
 
    return word;
}
Чёт на 37-й строке во время отладки выскакивает ошибка отладки, хотя там по идее программа должна уже закругляться. В чём тут дело, не подскажете?


https://www.cyberforum.ru/atta... 1458853917
0
Миниатюры
Задачка с расщеплением строки. Ошибка отладки  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2016, 00:12
Ответы с готовыми решениями:

Реализовать через тип данных структура. При сборке и отладки возникает ошибка. В чем ошибка?
С++ в таблице из 5 строк хранятся данные о товарах: наименование, цена, количество. Определить и...

ошибка отладки программы
Жму F5 в Microsoft Visual, экспресс-выпуск c++ 1&gt;------ Построение начато: проект: 2423,...

Ошибка отладки Windows C# приложения
Добрый день подскажите в чем может быть причина. В интернете не нашел ответы и в msdn тоже. ...

C++ Запуск без отладки ошибка !
Здраствуйте я в после написания программы нажимаю ctrl F5 и мне пишит ошибку программа : не можит...

5
159 / 151 / 92
Регистрация: 18.11.2015
Сообщений: 677
25.03.2016, 00:37 2
Хммм, а зачем тебе там оператор delete[]? Цитатка с википедии: "В языке программирования C++ оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, чтобы избежать утечки памяти.". Я у тебя new не вижу в мэйне.
А строки:
C++
1
2
delete[] line_aux;
            line_aux = nullptr;
Абсолютно странные, ты никакой памяти тут не освободил, хватило бы просто line_aux = nullptr;

Добавлено через 2 минуты
Вообще, после удаления этой проклятой 37-й строки все работает, вроде.
0
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 7
25.03.2016, 00:44  [ТС] 3
33-я строка - вызывается функция split(...) и
72-я строка - память выделяется

Вот путь следования выделенной памяти

word -> функция split(...) -> line_aux

Так что, полагаю, освободить всё-таки надо (именно так и делается в предыдущих циклах).

Это хорошо, что работает, только вот куча кушается.
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
25.03.2016, 01:29 4
В main():
C++
1
2
3
4
5
6
        if (line_aux == null)
        {
            //delete[] line_aux;
            line_aux = nullptr;
            break;
        }
В split():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    else if (*(saved_str + num) == '\0')
    {
        if (!flag)
        {
            flag = true;
            *(word + (num - num_former)) = '\0';
        }
        else
        {
            delete [] word;
            word = null;
        }
    }
0
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 7
25.03.2016, 01:40  [ТС] 5
Попробовал - всё равно та же история.
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
25.03.2016, 01:49 6
Цитата Сообщение от BMT_Victor Посмотреть сообщение
Попробовал - всё равно та же история.
И я попробовал (иначе бы не выложил исправления). Никакой истории.
0
Миниатюры
Задачка с расщеплением строки. Ошибка отладки   Задачка с расщеплением строки. Ошибка отладки  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2016, 01:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка во время отладки AtmelStudio7
Здравствуйте. Только начал изучать микроконтроллеры и пишу свой первый Hello World (мигание...

Resharper, ошибка отладки программы
После установки решарпера при нажатии на кнопку &quot;Запуск&quot; в Visual Studio выскакивает ошибка:...

Atmel Studio 6.1. Ошибка отладки
Добрый день! помогите пожалуйста разобраться с мк Atmega 128 и Atmel Studio 6.1. Создаю пустой...

Ошибка отладки программы с использованием Direct 11 на с++
Все программы которые я делал с использованием Direct 11, и даже примеры из DirectSDK ,все либы и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.