Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 27.06.2020
Сообщений: 1

Segmentation fault при использовании stack

22.01.2021, 16:11. Показов 525. Ответов 0

Author24 — интернет-сервис помощи студентам
Помогите исправить ошибку и понять, что же работает неправильно. Код переводит выражение из инфиксной формы в префиксную постфиксную. Работает корректно, если последняя операция не закрывающая скобка и выражение составлено верно. То есть (5+15)/(4+7-1) вызывает segmentation fault, но (5+15)/(4+7-1)+2 работает корректно. В коде помечено, где появляется segmentation fault.
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
#include <iostream>
#include <sstream>
#include <stack>
#include <string>
 
int prior(char ch) {
    if (ch == '+' || ch == '-')
        return 1;
    return 2;
}
 
int main() {
    std::stack<char> stack;
 
    std::stringstream ss;
    std::stringstream pf; //выполняет роль очереди для вывода. pf - postfix
 
    //Читаем строку в stringstream (это нужно, чтобы прочитать ровно строку)
    {
        std::string str;
 
        std::cout << "Infix expression: ";
        std::getline(std::cin, str);
 
        ss << str;
    }
    //Обрабатываем строку пока не кончится
    while (!ss.eof()) {
        //Читаем значение из
        char temp;
        ss >> temp;
        if (temp >= '0' && temp <= '9') { //Если число, то пишем в выражение
            pf << ' ' << temp;
            while (ss.peek() >= '0' && ss.peek() <= '9') {
                ss >> temp;
                pf << temp;
            }
        } else if (temp == '+' || temp == '-' || temp == '*' || temp == '/') {
            //Если приоритет операци <= чем на стеке, то выгружаем
            if (!stack.empty() && prior(temp) <= prior(stack.top())) {
                while (!stack.empty() && stack.top() != '(') {
                    pf << ' ' << stack.top();
                    stack.pop();
                }
            }
 
            stack.push(temp);
        } else if (temp == '(') {
            stack.push(temp);
        } else if (temp == ')') {
            /*по идее, проверка на пустоту не нужна, т.к. открывающая скобка должна быть в выражении,
            но иначе здесь segmentation fault*/
            while (!stack.empty() && stack.top() != '(') {
                pf << ' ' << stack.top();
                stack.pop();
            }
            stack.pop();
        }
    }
    while (!stack.empty()) {
        //Ошибка здесь, в stack.top(), хотя в цикле идет проверка на пустоту. Ошибка - segmentation fault
        pf << ' ' << stack.top();
        stack.pop();
    }
 
    std::cout << "Postfix expression:" << pf.str() << std::endl;
 
    return 0;
}
Добавлено через 14 минут
Также при вводе ((2+3) работает так, словно со скобками все в порядке

Добавлено через 36 минут
Проблема была в неправильном чтении с потока: проверка на eof должна находится после чтения конца, а не перед ним, это приводило к дублированию последнего символа. Похожая проблема: Дублирование последнего символа при чтении файла
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2021, 16:11
Ответы с готовыми решениями:

Segmentation fault при использовании модуля <time.h>
Есть код time_t now; struct tm * ptr; static char tbuf; bzero(tbuf,64); time(&amp;now); ptr = localtime(&amp;now); strftime(tbuf, 64,...

Segmentation fault при наследовании класса
Доброго времени суток! Имею класс Initialise и класс Environment. В первом создаются экземпляры движка и прочие сопутствующие вещи....

Segmentation fault при вызове метода
Собственно такое дело, имеется следующий код: Item* m_items; Player::Player() { ... memset(m_items, 0,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2021, 16:11
Помогаю со студенческими работами здесь

Segmentation fault при работе со стеком
Господа, если не затруднит, помогите пожалуйста с этой проблемой: Код компилируется, запускается -- и сразу аварийно завершает работу....

C++ ошибка кода Segmentation fault при динамической памяти
помогите пожалуйста. задание такое: нужна программа которая хранит название страны с медалями и может добавлять новые страны, а если имя...

Ошибка выполнения Segmentation fault при открытии файла
Привет всем! почему не открывается файл, не понимаю что такое? ubuntu 16, qt creator 3.6.1 #include &lt;string&gt; #include...

При вводе данных в программу выходит ошибка Segmentation fault
В чем может быть ошибка? Заранее спасибо! #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class MARSH { public:...

Ошибка "Segmentation fault" при организации дерева
Есть следующие функции Three сreateThree(Node **q) { if((*q)-&gt;p) { Three *one, *two; one =...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Сложность Колмогорова: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
C++26: Индексирование пакетов и метапрограммиро­вание
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
Состояние гонки в C#: подводные камни многопоточного программировани­я
UnmanagedCoder 20.03.2025
Что такое состояние гонки? Это ситуация, когда результат программы непредсказуемо меняется в зависимости от порядка выполнения потоков. Проще говоря, два или более потока пытаются одновременно. . .
Next.js для разработки React: преимущества серверного рендеринга
Reangularity 20.03.2025
Next. js решает классическую проблему React-приложений: медленную первоначальную загрузку и плохую индексацию поисковиками. Вместо того чтобы заставлять браузер пользователя выполнять всю работу по. . .
JUnit или TestNG: Выбираем Java-фреймворк для тестирования
Javaican 20.03.2025
История тестовых фреймворков в Java началась в конце 90-х, когда Кент Бек и Эрих Гамма разработали JUnit - инструмент, который перевернул представление разработчиков о модульном тестировании. JUnit. . .
Разбиваем монолит на два микросервиса и реализуем CI/CD
ArchitectMsa 20.03.2025
Когда команда растет, а функциональность монолита расширяется, поддерживать и развивать такую систему становится все труднее. Разработчики начинают тратить много времени на разбор сложных. . .
Python и PDF: Создание и редактирование файлов
py-thonny 20.03.2025
Работа с PDF-документами – одна из популярных задач в современной разработке. Python предлагает несколько инструментов для создания, чтения и редактирования PDF-файлов, среди которых особенно. . .
Корутины в Unity и производительно­сть WaitForSeconds
GameUnited 20.03.2025
Разработчики игр на Unity часто сталкиваются с вопросом: как выполнять действия через определённые промежутки времени, не блокируя основной поток игры? Тут как раз и приходят на помощь корутины —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер