超出范围的例外

时间:2010-05-04 20:16:48

标签: c# segmentation-fault

public override Models.CalculationNode Parse(string expression)
{
    var calNode = new Models.CalculationNode();

    int i = expression.Length;
    char[] x = expression.ToCharArray();
    string temp = "";

    //Backwards assembly of the tree

    //Right Node
    while (!IsOperator(x[i]) && i > 0)
    {
        if (!x[i].Equals(' ')) temp = x[i] + temp;
        i--;
    }
}

自从我使用了树以来,已经有一段时间了,我在while循环中遇到了一个超出范围的异常。

6 个答案:

答案 0 :(得分:1)

字符数组从零到长度为1

答案 1 :(得分:1)

你应该尝试写int i = x.Length - 1;

只要x包含从0x.Length - 1索引的项目,x[expression.Length]似乎只是一个超出范围的项目。

答案 2 :(得分:1)

我要反转测试:

while (i >= 0 && !IsOperator(x[i]))

因为IsOperator将首先被评估,并且我将在循环结束时为-1(不会遇到循环开始时可能遇到的任何问题)。

答案 3 :(得分:1)

i = expression.Length开始,你有一个1分之一的错误。第一个指数将立即超出界限。您可以将循环重写为for循环,如下所示:

char[] x = expression.ToCharArray();
string temp = "";

//Backwards assembly of the tree

//Right Node
for (int i = x.Length - 1; i >= 0 && !IsOperator(x[i]); --i)
{
    if (!x[i].Equals(' ')) temp = x[i] + temp;
}

答案 4 :(得分:0)

你需要:

int i = expression.Length;

然后在while循环中你需要:

while (!IsOperator(x[i]) && i >= 0)

数组基于0,因此0是第一个位置,最终位置是长度减去1。

答案 5 :(得分:0)

您将i设置为字符串的长度,从1开始。 你的数组索引从0开始,所以当你最后访问元素时,你实际上试图超越你的界限。这是抛出错误的循环的第一次运行。

您需要在初始化i时添加-1。