c# for循环中的Index超出了数组的边界
本文关键字:数组 边界 Index for 循环 | 更新日期: 2023-09-27 18:17:17
我已经制作了一款主机游戏一段时间了,我决定使用。txt文件来保存地图。以下代码打开并存储txt文件内容:
static void LoadMap(string fname)
{
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
string[] _tmp = new string[_org.Length];
for (int i=0;i<_org.Length;i++)
{
_tmp[i] = _org[i].ToString();
}
//This line has the error
for (int i=0;_tmp[i]!="$";i+=2)
{
mapwidth += 1;
}
for (int i=0;i<_tmp.Length;i++)
{
leveldata.Add(_tmp[i]);
}
}
我得到这个错误:索引超出了数组的边界。我不知道为什么。有人能帮忙吗?由于
检查变量i
的取值不能超过数组的Length - 1
。
static void LoadMap(string fname)
{
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
string[] _tmp = new string[_org.Length];
for (int i = 0;i < _org.Length; i++)
{
_tmp[i] = _org[i].ToString();
}
for (int i = 0;i < _tmp.Length && _tmp[i] != "$"; i += 2)
{
mapwidth += 1;
}
for (int i = 0;i < _tmp.Length; i++)
{
leveldata.Add(_tmp[i]);
}
}
我不太确定你在这里得到什么,但我觉得foreach
可能是朝着正确方向迈出的一步。
首先,我在您提供的代码中注意到以下几点:
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
在这里,您已经摄取了文本文件并使用逗号分隔符分割_org
。尽管您从未实际将拆分数组赋值给变量。_org
仍然是string
,而不是string[]
。
string[] _tmp = new string[_org.Length];
for (int i = 0; i < _org.Length; i++)
{
_tmp[i] = _org[i].ToString();
}
在此块中,我们将_tmp
设置为使用_org
长度的字符串数组。本例中的Length
属性将检索字符串_org
中的字符数。假设将_org
设置为"foo"
,则_tmp
数组的大小现在为3。(0, 1, 2)
然后加载_tmp
,并将_org
的第n个字符转换为字符串。
此时,我们的变量中有以下内容:
_org = "foo"
_tmp = {"f","o","o"}
接下来的部分让我有点措手不及,因为我不能确定你想要完成什么。
for (int i = 0; _tmp[i] != "$"; i += 2)
{
mapwidth += 1;
}
在_tmp[i]
等于"$"
之前,您一直处于for循环中,并且每次使用i += 2
通过循环时,您都会将2
添加到i
。这个逻辑将打破循环,直到它遇到一个"$"
,或者如果i
超出数组的边界,它将抛出一个异常。
然后,每增加两次i
,就给mapwidth
加1
在最后一个代码块中,您将_tmp
数组的内容添加到leveldata
for (int i = 0; i < _tmp.Length; i++)
{
leveldata.Add(_tmp[i]);
}
现在是好东西,foreach
。我假设您想将_org设置为一个数组,并且您想要所有不是"$"的内容。记住,这应该完成你想要的,尽管我不确定在第二个for循环中增加2的目的,所以我现在把它省略了。
static void LoadMap(string fname)
{
string[] _org = File.ReadAllText("Maps/" + fname + ".txt").Split(',');
foreach (var _tmp in _org)
{
if (_tmp != "$")
{
mapwidth += 1;
}
leveldata.Add(_tmp);
}
}
如果你想继续编码,那么掌握基础知识总是一个好主意。
虽然有点过时,这里是一个很好的教程由微软c#编程基础:c#程序员参考资料
试试这个链接。
https://www.programiz.com/csharp-programming/foreach-loop有建议关键字,以避免索引超出数组的边界错误。
示例代码。
for(int i = 0; i < myArray.Length; i++)
{
// Coding to Array for loop.
}