2013-10-18 146 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草案款 ++標準。