字符串程序的范围

时间:2013-08-27 21:54:17

标签: c#

这是一个程序,用于获取指定范围内字符串中的所有字母(在本例中为“kangaroo”一词的字符3到7)。

为什么我在第arr[i] = x[start+i];行收到错误?

我没有使用Substring,因为我的导师希望我们在没有它作为练习的情况下弄清楚如何做到这一点。

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);
        }
    }
}

7 个答案:

答案 0 :(得分:4)

我会解释你得到的错误,

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

开头

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

i < (end - start)


另一个错误可能是i&gt; = 4,在这种情况下,它会尝试访问arr[4],这也是范围之外


0123456789
kangaroo
garo##  /// what arr would be - # = error
garoo#   // where i would get you - # = error

答案 1 :(得分: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();
}

答案 2 :(得分:1)

如果您正在寻找打印部分字符串的最简单方法,那么评论中提到的最简单的方法就是使用String.Substring method.。要获得单词kangaroo的字符#3-7,您可以使用:

String.Substring(2,5);

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

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

x.ToCharArray(2,5)

答案 3 :(得分: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++)

答案 4 :(得分:0)

好的结局是7,开始是3. 3 + 6是9.袋鼠只有长度8,所以你会得到一个超出范围异常的索引(循环而我&lt;结束,并添加我开始得到索引)。正如其他人所建议你应该使用substring而不是你当前的方法。

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

也可能要检查开始和结束是否都小于myWord.Length

答案 5 :(得分:0)

你的数组溢出,arr []乘以1. Quanity(end-start)给你的数量小于你的范围。

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

答案 6 :(得分:0)

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

但是代码:

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

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

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

答:你不能!

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