1
string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');
foreach (var part in ip2)
{
    textBox3.Text = part[0].ToString();
    textBox4.Text = part[1].ToString();
    textBox5.Text = part[2].ToString();
    textBox6.Text = part[3].ToString();
}

大家好,我的问题是 textBox3 里面只有一个 1 ,而我希望它有 123 为了记录,ip = 123.456.789.101 用于测试目的。

结果是这样的: 结果

当它设置 textBox6 时它也会崩溃:索引超出了数组的范围。

4

4 回答 4

3

让我们手动跟踪您的代码:

  1. ip2包含数组{"123", "456", "789", "101"}
  2. 然后,您将在循环中对数组进行迭代,foreach因此依次part变为每个字符串"123", "456", 。"789""101"
  3. 然后,您将索引到字符串(带方括号),该字符串访问char字符串中的各个 s。所以在第一个循环中,
    • part[0]'1'
    • part[1]'2'
    • part[2]'3', 并且
    • part[3]超出字符串的范围(长度=3)。

请注意,您需要打电话ToString()也是一个很好的指标,有些地方出了问题。

相反,您想要(没有foreach循环),

string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');
textBox3.Text = ip2[0];
textBox4.Text = ip2[1];
textBox5.Text = ip2[2];
textBox6.Text = ip2[3];
于 2013-09-24T23:46:58.167 回答
1

你的逻辑不正确。

循环的每次迭代foreach都是一个完整的字符串。因此,当您这样做时:

part[NUMBER_HERE]

..您正在该字符串的该索引处访问单个字符。

IndexOutOfBounds你得到的错误是因为我上面所说的。如果您访问长度为 3 的字符串的索引 3 处的字符(索引 0、1 和 2).. 它将超出范围。

你根本不想要一个循环。将您的代码更改为:

string[] parts = ip.Split('.');
textBox3.Text = parts[0].ToString();
textBox4.Text = parts[1].ToString();
textBox5.Text = parts[2].ToString();
textBox6.Text = parts[3].ToString();

现在您有一个要索引的实际字符串数组......不是单个字符串。

于 2013-09-24T23:44:26.520 回答
1

删除foreach循环。

此行创建一个数组,其中每个值都在一个新插槽中。

string[] ip2 = ip.Split('.'); 

但是,这将获取数组中的每个单独值并访问其第 n 个插槽。

foreach (var part in ip2){
     textBox3.Text = part[0].ToString();
     textBox4.Text = part[1].ToString();
     textBox5.Text = part[2].ToString();
     textBox6.Text = part[3].ToString();
}

它将继续用给定位置上的字符(由索引确定)覆盖您的数据。最后一个条目是,101这就是文本框中最后一个值是和的原因。只需删除循环,你就可以了。101

于 2013-09-24T23:45:10.760 回答
0

这是因为您正在迭代拆分的第一个结果。数组 ip2 包含拆分的结果(即 ip2[0]="123")。但是然后你写part[0]了,因为 part 包含拆分的第一个结果(无论如何在第一次迭代中), part[0] 现在表示“123”中的第一个字符,当然是“1”。这是您需要做的:

string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');

textBox3.Text = ip2[0].ToString();
textBox4.Text = ip2[1].ToString();
textBox5.Text = ip2[2].ToString();
textBox6.Text = ip2[3].ToString();

理想情况下,在将拆分分配给文本框之前,您还需要检查拆分是否返回了足够的结果。

于 2013-09-24T23:46:40.987 回答