我试图用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()可能有更好的方法,但我仍然想了解导致错误的原因。 提前致谢 多伦。
答案 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个字符长。
尝试对字符串进行标记。一旦你尝试使用索引手动标记并计算出错了。令牌化是神派:) 祝你好运!