打破; 导致段故障(break; causing segment fault)

2019-10-29 01:51发布

我是做括号检查使用堆栈。 其中包含断裂 的if else语句; 语句引起段故障。

我试图消除破程序运行正常,但因为需要那个破打印正确的输出打印错误的答案。 什么是这样一个段故障的原因是什么? 破不访问任何内存unit.right?

问题链接

#include <iostream>
#include<stack>
using namespace std;

int main() {
//code
int n;
char c,comp;
cin>>n;
while(n--)
{
   stack<char>s;
   while(cin>>c)
   {
       if(c=='(' || c=='{'|| c=='[')
       s.push(c);
       else
       {
           comp=s.top();
           if(c==')' && comp=='(')
           s.pop();  
           else if(c==')' && comp!='(')
           {
               cout<<"not balanced"<<endl;
               break;  //this one, if i remove this no SIGSEGV
           }


           if(c=='}' && comp=='{')
            s.pop();
           else if(c=='}' && comp!='{')
           {
               cout<<"not balanced"<<endl;
               break;
           }


           if(c==']' && comp=='[')
           s.pop();
           else if(c==']' && comp!='[')
           {
               cout<<"not balanced"<<endl;
               break;
           }


       }

   }

       if(s.empty())
       cout<<"balanced"<<endl; 
}

return 0;
 }

Answer 1:

所以, 先上一些背景信息std::stack在以后将成为相关:

编程契约式的风格将是具有非空栈是呼吁流行的先决条件,而调用的方法不符合其前提条件有一个不确定的结果。

请注意,虽然我无法找到一个来源,说s.top()是不好当有一叠0的元素,我要承担这也将是坏出于同样的原因。

这是为什么重要? 好了, 不确定的行为可以做任何事情 ,包括段错误。 只要保持在你的后脑勺。

所以,这个代码就在这里:

comp=s.top();

如果你曾经遇到的情况下,会发生什么s是空的,你有别的东西从进来std::cin ? 举例来说,如果你在设置这样一个括号的最后有一个额外的):

()()) // <-- extra )

() S删除了,但)仍然存在。 所以,当你尝试引用顶部,无所不有。 这可能是什么原因造成的崩溃。

您需要解决此线检查,以确保s不是空的,你尝试引用前顶:

if(!s.empty()) {
    comp=s.top();
}

你也应该可能做到这一点各地的pop()以及:

if(c==')' && comp=='(' && !s.empty())
           s.pop();

或者诸如此类的话。 你的逻辑可能需要一些改造,但希望,让你的想法。



Answer 2:

因为你有一个平衡输入的情况下,没有终止你的循环崩溃的原因。 所以,你要结束了从空堆栈弹出的东西。

你应该用do while循环这个代码

do
{
    ...
    if (c == ')' && comp != '(')
        break;
    ...
}
while (!s.empty());
if (s.empty())
   cout << "balanced\n";
else
   cout << "not balanced\n";

虽然即使如此,你需要synchonise输入。 也许你应该阅读整个输入(每行一个字符串,也许?),然后输入字符串工作。 在这种情况下,你可以用替代while循环DO for循环,例如for (char c : input)



文章来源: break; causing segment fault
标签: c++ stack break