此代码采用char
数组作为参数,并返回包含数组中每个单词的数组。没有单词可以包含空格。因为我在tab[i][j] = str[counter]
上收到错误,可能需要一些帮助,但我认为你可以说出我想要它做什么。
public static char[][] split_string(char[] str)
{
char[][] tab = new char[20][];
int x = 1;
int counter = 0;
for (int i = 0; i < str.Length; i++)
{
for (int j = 0; j < str.Length; j++)
{
if (str[i] != ' ')
{
tab[i][j] = str[counter];
}
else
{
counter++;
break;
}
counter++;
}
}
return tab;
}
答案 0 :(得分:0)
宣布char[][] tab = new char[20][];
您正在创建一个大小为20的char数组。这是一个包含20个char元素的数组,这20个数组中的每一个都将设置为null。
所以,当你尝试tab[i][j] = str[counter];
时,你试图在数组选项卡的索引'i'上的数组的索引'j'上设置元素,但索引'i'上的数组数组'tabs'的'为null(因为数组'tabs'中的所有其他数组都是)。所以你得到NullReferenceException
。
一般来说,如果你得到一个NullReferenceException
,就意味着某些引用为空,呃。这可能意味着你忘了启动一些东西......你会指出它发生的地方,你的工作是找出那里的null,为什么它是null,质疑自己是否正确它是null。 ..如果不是,那么通过初始化变量来修复它。如果是,则检查null并为该情况做适当的事情。
在您的特定情况下,它不应为null。所以你必须启动它。初始化什么?您要填充的数组。请记住,当您说new char[20][];
时,您创建了一个包含20个数组的数组,这些数组设置为null,但您不希望它们为null,而是数组。
因此内部循环的简单tab[i] = new char[str.Length];
将解决当前问题。
好的,但一旦修复了,你将面临另一个问题。你看,你正在创建一个包含20个元素的数组。但是你在参数str
上获得的数组可能更长。所以 - 当发生这种情况时 - 当你试图超出数组索引19的元素时,你会得到一个IndexOutOfRangeException
。
说实话......很难从代码中推断出你想要做什么。
从方法的签名中猜测,我猜你想要一个字符数组并返回字符数组的数组,其中wach数组包含一个单词。
由于一些神秘的原因,你没有使用string
。如果我是对的,那么您应该使用的方法是string.Split
。
这些是我猜测的神秘原因:
好的,我们假设它是互操作的情况。你可以这样做:
1)从char数组创建一个新数组:
new string(str)
2)呼叫拆分:
(new string(str)).Split(' ')
3)将每个返回的字符串转换为char数组:
from string s in (new string(str)).Split(' ') select s.ToCharArray()
4)将生成的集合转换为数组:
(from string s in (new string(str)).Split(' ') select s.ToCharArray()).ToArray();
5)将其包装在方法上:
public static char[][] split_string(char[] str)
{
return (from string s in (new string(str)).Split(' ') select s.ToCharArray()).ToArray();
}
好的,你可以在没有LINQ的情况下完成:
public static char[][] split_string(char[] str)
{
var list = new List<char[]>();
foreach (string s in (new string(str)).Split(' '))
{
list.Add(s.ToCharArray());
}
return list.ToArray();
}
但这就是垃圾,这就是你应该做的事情:
1)接受一个字符串:
public static char[][] split_string(string str)
{
var list = new List<char[]>();
foreach (string s in str.Split(' '))
{
list.Add(s.ToCharArray());
}
return list.ToArray();
}
2)使用字符串返回:
public static string[] split_string(string str)
{
var list = new List<string>();
foreach (string s in str.Split(' '))
{
list.Add(s);
}
return list.ToArray();
}
3)摆脱填充:
public static string[] split_string(string str)
{
return str.Split(' ');
}
4)你为什么要申报方法呢?
// ...puff...