0

この C# エラーを解決しようとすると、いくつかの問題が発生します。

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at DayZMap.ProcessMemory.CutString(String mystring) in Z:\p\Memory.cs:line 45
   at DayZMap.Map.refreshMap(Object sender, PaintEventArgs e) in Z:\p\Form1.cs:line 517
   at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Form.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.OnPrint(PaintEventArgs e)
   at System.Windows.Forms.Control.WmPrintClient(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

クラッシュしている機能は次のとおりです。

public string CutString(string mystring)
{
    char[] chArray = mystring.ToCharArray();
    string str = "";
    for (int i = 0; i < mystring.Length; i++)
    {
        if ((chArray[i] == ' ') && (chArray[i + 1] == ' '))
        {
            return str;
        }
        if (chArray[i] == '\0')
        {
            return str;
        }
        str = str + chArray[i].ToString();
    }
    return mystring.TrimEnd(new char[] { '0' });
}

次の行で例外をスローします。

if ((chArray[i] == ' ') && (chArray[i + 1] == ' '))

アドバイスをいただければ幸いです。ありがとう。

4

6 に答える 6

1

chArray[i + 1]は配列の長さを超えています。おそらく まで反復するつもりでしたmystring.Length - 1

于 2013-05-24T18:34:17.173 に答える
1

インデックスを作成しているときchArray[i + 1]に、配列のサイズを超えている可能性が非常に高くなります。

たとえば、ループ内にchArray5​​ 文字ある場合i、範囲外のコードでアクセスしようとします (その例の配列の範囲は 0-4 になります)。4chArray[5]

このコードの意図はわかりませんが、修正の 1 つは、制限forを 1 つ減らすことです。

for (int i = 0; i < mystring.Length - 1; i++)
于 2013-05-24T18:34:39.813 に答える
0
if (... && (chArray[i + 1] == ' '))

の場合i == myString.Length - 1、その行は文字列の境界を 1 つ超えます。

于 2013-05-24T18:34:23.547 に答える
0

最後の文字が ' ' の場合、範囲外の位置でインデックスを作成しています。chArray[i + 1]

于 2013-05-24T18:34:38.810 に答える