0

This is a program to get all the letters in a string in a specified range (in this case characters 3 through 7 of the word 'kangaroo').

Why am i getting an error at line arr[i] = x[start+i];?

I am not using Substring because my instructor wants us to figure out how to do it without it as an exercise.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MethodsPractice2
{
    class Program
    {
        static char[] GetRangeOfCharacters(string word, int start, int end)
        {
            string x = word;
            char[] arr = new char[end - start];

            for (int i = 0; i < end; i++)
            {
                arr[i] = x[start + i];
            }

            return arr;
        }

        private static void Main(string[] args)
        {
            char[] endResult;
            string word = "kangaroo";
            int start = 3;
            int end = 7;
            endResult = GetRangeOfCharacters(word, start, end);
            Console.WriteLine(endResult);
        }
    }
}
4

7 回答 7

4

我会解释你得到的错误,

您说过您希望从字符 3 开始,并填充arr有 4 个条目,字符从(3)+开始i

i可以是任何小于7.. 3 + 6 = 9 的数字;并且Kangaroo里面有8个字母......因此你至少需要for循环

i < (end - start)


可能得到的另一个错误是 i >= 4 在这种情况下它会尝试访问arr[4]也超出范围的


0123456789
kangaroo
garo##  /// what arr would be - # = error
garoo#   // where i would get you - # = error
于 2013-08-27T22:03:14.873 回答
1

end 是 7,所以你从 0 循环到 7,所以下标 3 到 10 所以

for (int i = 0; i < end; i++)

应该

for (int i = 0; i < (end - start); i++)

或者甚至更清楚

for (int i = 0; i < arr.Length; i++)
于 2013-08-27T22:06:52.983 回答
1

因为您在循环中使用了太多字符:

static char[] GetRangeOfCharacters(string word, int start, int end)
{
    string x = word;
    char[] arr = new char[end - start];

    for (int i = 0; i < end; i++) // <--- here!!!
    {
        arr[i] = x[start + i];  
    }
    return arr;
}

正确的是

for (int i = 0; i < end - start; i++)

我会改用它(跳过无效参数检查):

static char[] GetRangeOfCharacters(string word, int start, int end)
{
    return word.Skip(start).Take(end - start).ToArray();
    // or more efficient: word.Substring(start, end - start).ToCharArray();
}
于 2013-08-27T21:57:42.883 回答
1

如果您正在寻找打印部分字符串的最简单方法,如评论中所述,最简单的方法是使用该String.Substring方法。. 要获取 word 的字符 #3-7 kangaroo,您可以使用:

String.Substring(2,5);

2 是起始索引(它是从 0 开始的,所以 2 是第三个字符),5 是长度。

如果您需要字符数组(如您的返回类型所示),您可以尝试使用该String.ToCharArray方法,其功能相同:

x.ToCharArray(2,5)
于 2013-08-27T21:59:35.567 回答
0

那么 end 是 7,start 是 3。3 + 6 是 9。Kangaroo 的长度只有 8,所以你会得到一个超出范围异常的索引(循环 while i < end,并添加 i 开始获取索引) . 正如其他人建议的那样,您应该使用 substring 而不是当前的方法。

  string subString; 
  if (end - start < 0)
      subString = null; // error!
  else
      subString = myWord.SubString(start, end - start);

可能还想检查 start 和 end 是否都小于myWord.Length

于 2013-08-27T22:00:41.773 回答
0

你的数组 arr[] 溢出了 1。数量(结束开始)给你的范围比你的范围小一。

您需要使用数量 (end-start+1) 来调整目标数组的大小。

于 2013-08-27T22:03:48.783 回答
0

arr是一个有 4 个插槽 (7 - 3) 的数组。

但是代码:

for (int i = 0; i < end; i++)

将循环 7 次(因为== 7),尝试在每次迭代end时写入新位置。arr

问:如何将 7 个不同的值存储到只有 4 个插槽的数组中?

答:你不能!

(您的 for 循环需要不同的约束)。

于 2013-08-27T22:13:21.043 回答