String.Substring()与某些输入崩溃

时间:2016-12-18 21:45:18

标签: c#

我试图用Substring()分割一个字符串,我遇到了一个问题,我一直在用certin值崩溃。有问题的通道是(根据"调试"我试过):

string sub = str.Substring(beg,i);

,整个代码是:

    static void Prints(string str)
    {
        int beg = 0;
        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] == '*')
            {
                Console.WriteLine(i);
                //Console.WriteLine("before");
                string sub = str.Substring(beg,i);
                //Console.WriteLine("after");
                beg = i+1;

                if (sub.Length % 2 == 0)
                {

                    Console.WriteLine(sub.Length/2);
                    int n = sub.Length / 2;
                    Console.WriteLine("{0} {1}", sub[n-1], sub[n]);
                }
                else
                {
                    int n = sub.Length / 2;
                    Console.WriteLine(sub[n]);
                }

当输入为:

时发生错误
hi*its*

即输出:

h i


Unhandled Exception: System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
   at System.String.Substring(Int32 startIndex, Int32 length)
   at _39.Program.Prints(String str) in D:\12\39\Program.cs:line 36
   at _39.Program.Main(String[] args) in D:\12\39\Program.cs:line 13

我知道使用split()可能有更好的方法,但我仍然想了解导致错误的原因。 提前致谢 多伦。

1 个答案:

答案 0 :(得分:1)

问题是你没有从整体长度中减去你进入字符串的距离。 如果查看调试输出,您会发现:

str.Substring(3, 1) = "i"
str.Substring(3, 2) = "it"
str.Substring(3, 3) = "its"
str.Substring(3, 4) = "its*"
str.Substring(3, 5) = // Error! You're beyond the end of the string.

很明显,你试图从位置3开始拉出(在你的例子中)6个字符。这将需要一个总长度为10或更长的输入字符串(因为子字符串是基于零索引的)。您的输入字符串只有7个字符长。

尝试对字符串进行标记。一旦你尝试使用索引手动标记并计算出错了。令牌化是神派:) 祝你好运!