0

これは、指定された範囲 (この場合は「カンガルー」という単語の 3 文字目から 7 文字目) の文字列内のすべての文字を取得するプログラムです。

行でエラーが発生するのはなぜarr[i] = x[start+i];ですか?

Substring を使用していないのは、インストラクターが演習として 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);
        }
    }
}
4

7 に答える 7

4

表示されるエラーについて説明します。

あなたは文字 3 から始めたいと言い、+arrで始まる文字で 4 つのエントリを入力します。(3)i

i7.. 3 + 6 = 9未満の任意の数にすることができます。その中にKangarooは8文字が含まれています...したがって、少なくともforループに移動する必要があります

i < (end - start)


arr[4]取得できる他のエラーは i >= 4 です。この場合、これも範囲外にアクセスしようとしています。


0123456789
kangaroo
garo##  /// what arr would be - # = error
garoo#   // where i would get you - # = error
于 2013-08-27T22:03:14.873 に答える
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 は 3 番目の文字) で、5 は長さです。

(戻り値の型が示すように) 文字の配列が必要な場合は、同じように機能するString.ToCharArrayメソッドを使用してみてください。

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

配列 arr[] を 1 でオーバーフローさせています。Quantity (end-start) は、範囲のサイズよりも 1 少なくなります。

ターゲット配列のサイズを設定するには、数量 (end-start+1) を使用する必要があります。

于 2013-08-27T22:03:48.783 に答える
0

arr4 スロット (7 - 3) のアレイです。

しかし、コード:

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

7 回ループし (== 7 のため)、反復ごとにend新しい位置に書き込もうとします。arr

Q: スロットが 4 つしかない配列に 7 つの異なる値を格納するにはどうすればよいですか?

A:できません!

(for ループには異なる制約が必要です)。

于 2013-08-27T22:13:21.043 に答える