子串长度错误

时间:2018-03-05 10:06:43

标签: c#

我一直收到错误

  

未处理的类型' System.ArgumentOutOfRangeException'发生在mscorlib.dll

在我的代码中输入超过70个字符的值时,有人可以解释一下原因吗?

namespace testingStrategiesCoding
{
    class Program
    {
        static void Main(string[] args)
        {
            string userMessage;
            int messageLength;
            string newMessage1;
            string newMessage2;
            string newMessage3;

            Console.WriteLine("Enter a message");
            userMessage = Console.ReadLine();

            messageLength = userMessage.Length;

            if (messageLength < 71)
            {
                Console.WriteLine("");
                Console.WriteLine(userMessage);
            }

            else if (messageLength > 70 && messageLength < 141)
            {
                newMessage1 = userMessage.Substring(0, 70);
                newMessage2 = userMessage.Substring(71, messageLength);
                Console.WriteLine("");
                Console.WriteLine(newMessage1);
                Console.WriteLine("");
                Console.WriteLine(newMessage2);
            }

            else if (messageLength > 140 && messageLength < 211)
            {
                newMessage1 = userMessage.Substring(0, 70);
                newMessage2 = userMessage.Substring(71, 140);
                newMessage3 = userMessage.Substring(141, messageLength);
                Console.WriteLine("");
                Console.WriteLine(newMessage1);
                Console.WriteLine("");
                Console.WriteLine(newMessage2);
                Console.WriteLine("");
                Console.WriteLine(newMessage3);
            }   
            else
            {
                Console.WriteLine("Invalid, please enter a message lower than 210 characters.");
            }

            Console.ReadKey();
        }
    }
}

我不认为这是重复的,因为错误是代码的一部分因素,没有其他线程似乎与之相关。

2 个答案:

答案 0 :(得分:10)

Substring(71, messageLength)

第二个子串参数是长度,而不是结束索引。您需要减去start-index才能生效。此外,您可能希望从70开始,或者丢失一个角色。

Substring(70, messageLength - 70)

答案 1 :(得分:0)

要完全避免此问题,请考虑使用MoreLINQ&#39; Batch(将字符串拆分为70个字符&#39;&#39; /&#39;批次&#39 ;)

这样做的好处是可以避免担心偏移等问题。

代码看起来像:

using System;
using MoreLinq;

namespace MattConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter a message");
            var userMessage = Console.ReadLine();

            if (userMessage?.Length <= 210)
            {
                var batchedData = userMessage.Batch(70);

                foreach (var entry in batchedData)
                {
                    Console.WriteLine("");
                    var asString = string.Concat(entry);
                    Console.WriteLine(asString);
                }
            }
            else
            {
                Console.WriteLine("Invalid, please enter a message lower than 210 characters.");
            }

            Console.ReadKey();
        }
    }
}