分段错误中的分隔符匹配(核心转储)

Delimiter matching in segmentation fault (core dumped)

本文关键字:核心 转储 错误 分隔符 分段      更新时间:2023-10-16

我在运行程序时不断出现分段错误。我不知道出了什么问题。我在谷歌上搜索了错误信息,我只是不知道它是什么意思。任何帮助都会很棒!

#include<iostream>
#include <stack>
using namespace std;
bool delimiterMatching(char *file){
  stack<char> x;
  int count = 0;
  char ch, onTop, check;
  while(ch != '/n'){
    ch = file[count];
    if (ch == '(' || '[' || '{')
      x.push(ch);
    else if (ch == ')' || ']' || '}') {
      onTop == x.top();
      x.pop();
      if((ch==')' && onTop!='(') || (ch==']' && onTop!='[') || (ch=='}' &&
                                onTop!= '{'))
    return false;        
    }
  count++;
  }
  if (x.empty())
    return true;
  else 
    return false;
}

int main()
{
  char test[50];
  cout << "enter sentence: ";
  cin >> test;
    if (delimiterMatching(test))
    cout << "success" << endl;
  else 
    cout << "error" << endl;
  return 1;
}

分段错误意味着您的程序试图访问无效的内存地址。通常情况下,这意味着您取消了对悬挂指针的引用或索引超过了数组的末尾。

在这种情况下,问题似乎出在while(ch != '/n')行上。它有两个问题:

  • 首先,'/n'不是有效的字符文字。您可能是指'n',它表示换行符
  • 其次,您的字符串不会以换行符结尾,因为cin >> test读取一行并在末尾丢弃换行符。循环将经过数组的末尾,进入内存中它后面的任何位置,试图找到换行符,最终它将到达无法访问的位置,从而导致分段错误。您应该检查'',它是实际标记字符串末尾的空字符

当我将ch != '/n'更改为ch != ''时,程序不会崩溃。

顺便说一句,使用std::string比使用char[50]更容易、更安全。

您不能使用这样的比较

    if (ch == '(' || '[' || '{')

尝试

    if (ch == '('  || ch== '[' || ch=='{')