我在程序运行时遇到错误:
“Debug Assertion Failed!... Expression:字符串下标超出范围。”
当我的if语句尝试检查字符串中的'i'处的字符是否为Delimiter()或isOperator()时,我的for循环中发生了这种情况。我将char'check'作为属性传递,并且在评论中我确保'check'正在抓取正确的字符。我一直在研究这个问题,我似乎无法解决它。
在底部编辑
string inputLine = "";
string inputString = "";
int main()
{
ifstream input("input.txt");
getline(input, inputLine);
if (input.is_open())
{
while (!input.eof())
{
getline(input, inputLine);
for (int i = 0; i<inputLine.length(); i++)
{
char check = inputLine[i];
//cout << check << "\n"; // test for correct character
if ((inputLine[i] != ' ') || (inputLine[i] != isDelimiter(check)) || (inputLine[i] != isOperator(check)))
{
inputString = inputString + inputLine[i];
//cout << lexer(inputString) << "\n";
//cout << inputString;
} // end if
else
{
cout << lexer(inputString);
if (inputLine[i] == isDelimiter(i))
cout << inputLine[i] + "\tDELIMITER";
if (inputLine[i] == isOperator(i))
cout << inputLine[i] + "\tOPERATOR";
inputString = "";
} // end else
//cout << inputString << "\n";
} // end for
} // end while
//input.close();
}
else cout << "Unable to open file.";
return 0;
}
这是isDelimiter()和isOperator()方法。
bool isOperator(char c)
{
if ((inputLine[c] == '+') || (inputLine[c] == '-') || (inputLine[c] == '*') || (inputLine[c] == '/') || (inputLine[c] == '=') || (inputLine[c] == '%') || (inputLine[c] == '<') || (inputLine[c] == '>'))
return true;
else
return false;
}
bool isDelimiter(char c)
{
if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
return true;
else
return false;
}
感谢任何帮助!
EDIT ::
在审查了我的代码后,我意识到了这个错误,但我仍然有另一个错误。那个运行时错误是因为在我的isOperator()和isDelimiter()函数中,我正在检查inputString [c]而不仅仅是'c'。愚蠢的错误,我知道。但是,虽然不再出现错误,但程序仍会跳过检查isOperator()和isDelimiter()方法,并且只在读取''时才进入else语句。为什么它不会进入我的运算符和分隔符的else语句?
答案 0 :(得分:1)
您的功能需要char
,将其更改为int
:
bool isDelimiter(char c) //should be int
{
if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
return true;
else
return false;
}
答案 1 :(得分:0)
我明白了,即使它们是简单的错误,也许它会在将来帮助某人。毕竟,我被困了一段时间。
它们主要是语法错误,我真的需要梳理我的编码。
这是我的功能现在遵循的格式。请注意,我终于传递了正确的值。
bool isDelimiter(char c)
{
if ((c == ';') || (c == '(') || (c == ')') || (c == ','))
return true;
else
return false;
}
这就是我现在称呼他们的方式。我试图检查输入本身是否等于函数,这就像询问“helloworld”== TRUE。显然这不起作用,一旦我想出来,我就想踢自己。这是片段:
if ((inputLine[i] == ' ') || (isDelimiter(check)) || (isOperator(check)))
{
cout << lexer(inputString);
if (isDelimiter(check))
{
cout << inputLine[i] << "\t\tDELIMITER\n";
}
if (isOperator(check))
{
cout << inputLine[i] << "\t\tOPERATOR\n";
}
inputString = "";
} // end if
else
{
inputString = inputString + inputLine[i];
} // end else
这解决了我的基本问题,现在解决了更大的问题。