2013-10-18 84 views
1

我正在写一个简单的支架检查器。应该很容易。当它全部在一个函数中时,我有它的工作,但我还需要为stdin做些事情。所以我认为最好做2个功能。这就是说,我在检查第82行的堆栈是否为空时出错。无论出于何种原因,它不允许我检查堆栈的顶部是否为空。我在一个测试程序中尝试了解它是否是某种引用错误,或者是否通过其他方法超出了范围。不是。应该正常工作,因为它是一个全局变量。为什么我不能检查我的堆栈上有什么?

关于我在做什么错的想法?我所有的知识和知识都指出我正确地做到了这一点。

以下是所有的代码。它的可编译。如果我需要澄清任何我会更乐意去做的事情。

感谢

#include <iostream> 
#include <sstream> 
#include <stack> 
#include <deque> 
#include <fstream> 
#include <cstdlib> 
using namespace std; 

stack<char> BracketsCheck; 
int linecounter = 0; 
int FileNumber = 1; 
int pos; 
string str =""; 
string filename; 

int validate(string string) 
{ 
     int size = str.size(); 
     for (int i = 0; i < str.size(); i++) 
     { 
      pos = i; 
      if ((str[i] == '(') || (str[i] == '[') || (str[i] == '{')) 
      { 
       BracketsCheck.push(str[i]); 
      } 
      else if (str[i] == ')') 
      { 
       if (BracketsCheck.top() == '(') 
        BracketsCheck.pop(); 
       else 
       { 
        cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open parenthesis" << endl; 
        return EXIT_FAILURE; 
       } 
      } 
      else if (str[i] == ']') 
      { 
       if (BracketsCheck.top() == '[') 
        BracketsCheck.pop(); 
       else 
       { 
        cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open squre bracket" << endl; 
        return EXIT_FAILURE; 
       } 
      } 
      else if (str[i] == '}') 
      { 
       if (BracketsCheck.top() == '{') 
        BracketsCheck.pop(); 
       else 
       { 
        cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open curly brace" << endl; 
        return EXIT_FAILURE; 
       } 
      } 
     } 
} 

int main(int argc, char* argv[]) 
{ 
// BracketsCheck.top() = 'h'; 

    if (argc == 1) 
    { 
     cin >> str; 
     cout << "no arguments" << endl; 
     validate (str); 
     return 0; 
    } 
    else 
    { 
     while (argv[FileNumber] != NULL) 
     { 
      filename = argv[FileNumber]; 
      ifstream inFile(argv[FileNumber]); 
      cout << argv[FileNumber]<<endl; 
      while (getline(inFile, str)) 
      { 
       validate(str); 
       linecounter++; 
      } 
      if (BracketsCheck.top() != NULL) 
      { 
       cout << "got to null checker" << endl; 
       cout << filename << ":" << linecounter << ":" << pos << "umatched closing brace" << endl; 
       return EXIT_FAILURE; 
      } 
      FileNumber++; 
     } 
     return 0; 
    } 
} 
+0

是的,字符串字符串只是我写的时候创建的一个临时变量,绝对要回去改变它。但我会尝试空()的东西,看看它是否工作 – cmonnats23

+0

无论出于何种原因,这是有效的。不知道为什么'!BracketsCheck.empty()'与BracketsCheck.top()!= NULL'有任何不同,但它确实如此。任何想法为什么?此外,如果您将您的评论写入答案,则将您标记为正确答案。谢谢! – cmonnats23

回答

3

根据您回应我的意见。如果你想检查堆栈不为空,你应该使用!BracketsCheck.empty()也:

int validate(string string) 

可能不是因为你会躲在string类型是个好主意。

top()将返回参考const引用不是指针,如果你的筹码是空的,你不应该叫top

我也使用劝阻你:

using namespace std; 

它被认为是bad practice我意识到打字std::所有的时间可在第一讨厌,但你真的得到了一段时间后使用它。

最后validate需要return声明,因为它应该返回int和流走函数结尾没有在这种情况下,回报将调用不确定的行为按6.6.3return语句从C草案款 ++标准。