我不知道如何修复此运行时错误:
http://postimg.org/image/hh9vl7hi9/
roomsInfo的值是:“@ 114 | mag | nir | 1 || dan | nir | 1 || \ 0” 当值为:“dan | nir | 1 || \ 0”时崩溃 (当时的第二次)当我尝试这一行时:
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0'));
这是完整的代码:
String roomsInfo = Program.sendToServ("@10||");
String[] room_name = new String[100];
String[] admin_name = new String[100];
String[] number_of_people = new String[100];
int check = 0, count = 0;
if(roomsInfo.IndexOf('\0') > 5)
{
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('\0'));
while (roomsInfo[roomsInfo.IndexOf('|') + 2] != '\0' && roomsInfo[roomsInfo.IndexOf('|') + 1] != '\0') // @114|roomName1|RoomAdmin1|count1||roomName2|RoomAdmin2|count2||
{
if (check == 0)
{
room_name[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|'));
check = 1;
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0'));
}
if (check == 1)
{
admin_name[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|'));
check = 2;
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0'));
}
if (check == 2)
{
number_of_people[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|'));
check = 0;
count++;
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 2, roomsInfo.IndexOf('\0'));
}
}
}
谢谢! 尼尔
答案 0 :(得分:0)
为了正确地子串你必须获得子串的长度就像你在数学中得到Vector的长度一样。
例如,你在一行中有两个点。比如5和13.要获得5到13之间的长度,你必须从13减去5.所以13 - 5 = 8
int startIndex = roomsInfo.IndexOf('|') + 1;
int endIndex = roomsInfo.IndexOf('\0');
int length = endIndex - startIndex;
roomsInfo = roomsInfo.Substring(startIndex, length); // Will Get nir|1||
如果你想获得Last char。你必须加1到长度
roomsInfo = roomsInfo.Substring(startIndex, length + 1); // Will Get nir|1||\0
从我在你的代码中看到的。你的子串都错了。所以你必须对所有人这样做。
一线解决方案
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0') - roomsInfo.IndexOf('|') - 1);
再次,如果你想获得最后一个字符,你必须加1长度。
答案 1 :(得分:0)
我猜这可能与||有关在记录之间(我记得是一个记录分隔符?)和你的子字符串索引。
Glenn所说的将把记录拆分成字段,但在你的情况下,你的所有记录都被链接在一起(我假设用||?分隔)然后最终以空零结束。因此,在将记录拆分为字段之前,首先需要将字符串拆分为一组记录。
struct RoomInfo
{
public String RoomName;
public String AdminName;
public String WhatIsNir;
public int NumberOfPeople;
}
var roomsInfo = new List<RoomInfo>();
String allData = "@114|mag|nir|1||@115|dan|nir|1||\0".TrimEnd('\0');
String[] delimiters = new string[] { "||" };
String[] records = allData.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
foreach (var record in records)
{
String[] fields = record.Split('|');
roomsInfo.Add(new RoomInfo
{
RoomName = fields[0],
AdminName = fields[1],
WhatIsNir = fields[2],
NumberOfPeople = int.Parse(fields[3])
});
}
另一个问题可能是您的数据和字段不匹配。即你的三个字段在下面的字符串中重复在哪里? &#34; @ 114 | MAG | NIR | 1 ||担| NIR | 1 || \ 0&#34 ;.我看到该字符串中有四个字段,所以我在上面的示例中添加了一个(房间名称)。
当然,使用此解决方案就是说您对数据格式有承诺。如果这是你能够改变的东西(即不是由第三方决定),那么我会把它改成更标准的东西。即使是CSV的基本形式也是类似的,但可能会更好。
答案 2 :(得分:0)
您的实施非常复杂。它可以通过几行代码完成,这样更容易维护:
string roomsInfo = Program.sendToServ("@10||");
var room_name = new List<string>();
var admin_name = new List<string>();
var number_of_people = new List<string>();
if(roomsInfo.IndexOf('\0') > 5)
{
roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('\0'));
var records = roomsInfo.Split(new[] {"||"}, StringSplitOptions.None);
foreach (var rec in records)
{
var fields = rec.Split(new [] {'|'}, StringSplitOptions.None);
room_name.Add(fields[0]);
admin_name.Add(fields[1]);
number_of_people.Add(fields[2]);
}
}
当然,这可以通过控制异常来改进。