为什么我无法检查堆栈上的内容
Why I cant check whats on my stack?
我正在编写一个简单的括号检查器。应该很容易。当它全部在一个功能中时,我让它工作,但我还需要为 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;
}
}
根据您对我的评论的回应。如果您尝试检查堆栈是否不为空,则还应使用!BracketsCheck.empty()
:
int validate(string string)
可能不是一个好主意,因为您将隐藏string
类型。
top() 将返回引用或常量引用而不是指针,如果您的堆栈为空,则不应调用 top
。
我也不鼓励你使用:
using namespace std;
这被认为是不好的做法,我意识到一开始一直打字std::
可能会很烦人,但一段时间后你真的习惯了。
最后validate
需要一个return
语句,因为它应该返回int
并且在这种情况下,根据C++标准草案中的返回语句第 2 段6.6.3
调用函数结束而流出的未定义行为。
相关文章:
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 是否可以检查悬挂光纤的调用堆栈?
- 使用堆栈从黑客等级中解决平衡括号检查的错误
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 运行时检查失败 - 变量周围的堆栈已损坏
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 如何在 Linux 运行时检查堆栈使用情况?
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'k'已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 运行时间检查:变量周围的堆栈已损坏
- 运行时检查失败#2 - 变量周围的堆栈'myArray'已损坏.- 似乎无法弄清楚如何删除此错误
- 运行时检查失败 #2 - 变量周围的堆栈'normalIndex'已损坏
- 无锁的堆栈:在POP()期间检查危险指针时可见性问题
- C 程序用于使用堆栈检查正确的HTML标签
- 错误:运行时检查失败 #2 - 变量周围的堆栈已损坏
- 布尔计算器如何使用堆栈检查用户输入