c#代码出错

时间:2015-12-12 15:44:06

标签: c# visual-studio

此代码采用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;
}

1 个答案:

答案 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

这些是我猜测的神秘原因:

  • 您是虐待老师的受害者,希望您不要使用字符串,列表或类似内容。
  • 你需要与一些只能理解字符数组的系统互操作。
  • 您使用了错误的语言标记,这是一个C问题,而不是C#问题。

好的,我们假设它是互操作的情况。你可以这样做:

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...