需要帮助。 string.substring(0,max.Length)

时间:2011-02-12 11:24:35

标签: c# string char

ArgumentOutofBounds循环中ifs内的所有时间都会抛出异常。

在这段代码中,我试图在符号@ 2 @ 3之间发送两个字符串。

字符串1 + “@ 2 @ 3” +字符串2

现在我尝试通过方法substring将字符串与符号分开,但是在那里抛出异常......

public void seperatePMChattersNames(string TwoNames)
{
    string nameOne="";
    string nameTwo="";

    Console.WriteLine(TwoNames);
    for (int i = 0; i < TwoNames.Length; i++)
    {
        if (TwoNames[i] == '2' && TwoNames[i-1] == '@')///ArgumentOutofRange Exception
        {
                nameOne = TwoNames.Substring(0, i);
        }
        if (TwoNames[i] == '@' && TwoNames[i+1] == '3')///ArgumentOutofRange Exception
        {           
            nameTwo = TwoNames.Substring(i+1, TwoNames.Length);               
        }
    }
}

为什么会抛出它以及如何防止它?

4 个答案:

答案 0 :(得分:1)

i为零时,TwoNames[i - 1]将尝试访问字符串的索引-1 - 不存在。

iTwoNames.Length - 1时,TwoNames[i + 1]将尝试访问字符串末尾。

接下来,当您 找到“@ 3”时,您正在使用:

TwoNames.Substring(i+1, TwoNames.Length)

Substring的第二个参数是要采用的子字符串的 length ,而不是最终索引。如果您只想要字符串的其余部分,则可以省略第二个参数:

TwoNames.Substring(i+1)

请注意,这包括“3” - 所以你可能真的想要i + 2而不是i + 1.

你有没有理由不使用string.IndexOf(TwoNames, "@2")等?

如果你只想让nameOne成为第一个“@ 2”之前的字符串而nameTwo成为最后一个“@ 3”之后的字符串,你可以使用:

int endOfOne = TwoNames.IndexOf("@2");
if (endOfOne != -1)
{
    nameOne = TwoNames.Substring(0, endOfOne);
}
else
{
    // Couldn't find @2... throw exception perhaps?
}

int startOfTwo = TwoNames.LastIndexOf("@3");
if (startOfTwo != -1)
{
    // Allow for the "@3" itself
    nameTwo = TwoNames.Substring(startOfTwo + 2);
}
else
{
    // Couldn't find @3... throw exception perhaps?
}

另一种选择是使用正则表达式 - 当然它们本身会增加一定程度的复杂性,但它们实际上是针对模式匹配的。如果你发现你需要获得更多的零碎,他们可以提供帮助。

答案 1 :(得分:1)

你的循环以i = 0开头但是在你的第一个if语句中你尝试访问试图访问TwoNames [-1]的TwoNames [i-1]。显然这会导致问题,因为没有TwoName [-1]。

你的循环应该从i = 1开始,而不是0。

答案 2 :(得分:0)

 for (int i = 0; i < TwoNames.Length; i++)

应该是

 for (int i = 1; i < TwoNames.Length-1; i++)

答案 3 :(得分:0)

这是答案

public void seperatePMChattersNames(string TwoNames)
        {
                Console.WriteLine(TwoNames);
                int x = TwoNames.IndexOf("@2");
                int y = TwoNames.IndexOf("@3");
                string nameone = TwoNames.Substring(0, x);
                string nametwo = TwoNames.Substring(y+2);
                Console.WriteLine(nameone);
                Console.WriteLine(nametwo);
        }