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

时间:2014-09-17 05:22:46

标签: c++

运行程序时,我一直收到分段错误错误。我不知道有什么不对。我用Google搜索了错误信息,我只是不知道这意味着什么。任何帮助都会很棒!

#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;
}

2 个答案:

答案 0 :(得分:2)

分段错误意味着您的程序试图访问无效的内存地址。通常,它意味着您取消引用悬空指针或索引到数组末尾。

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

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

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

顺便说一句,使用std::string而不是char[50]会更容易,更安全。

答案 1 :(得分:1)

您无法使用此类比较

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

尝试

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