c#异常索引超出范围

时间:2013-10-11 06:59:05

标签: c# exception

public class Word
{
    private string _inputWord;
    public Word()
    {
        Console.WriteLine("Enter a word");
        _inputWord = Console.ReadLine();

    }

    public void sortandcount()
    {
        char[] test = _inputWord.ToCharArray();
        char temp;
        int count = 0, tcount = 0;
        Array.Sort(test);
        int length = test.Length;
        temp = test[0];

        while (length > 0)
            {
                for (int i = 0; i < test.Length; i++)
                {
                    if (temp == test[i])
                    {
                        count++;
                    }
                }
                Console.WriteLine(temp + " " + count);
                tcount = tcount + count;
                temp = test[tcount]; //this line 
                length = length - count;
                count = 0;
            }
        }



    }

    class Program
    {
        public static void Main() //this line 
        {
        Word obj = new Word();
obj.sortandcount();
        }
    }

我在那条线上我已经指出作为评论的两条线(作为//程序中的这一行)得到例外,你们可以帮助我清除这一点。 M idea abt该程序是计算给定单词中的字符数(相同)。 比如Apple A-1 P-2 L-1 E-1

4 个答案:

答案 0 :(得分:2)

当您计算所有字母后tcount == test.length,这意味着test[tcount]会将一个元素编入索引到远处。

给定任何数组arr然后arr[arr.length]将总是超出范围,因为arr是零索引。在temp = test [tcount]之前,你需要确保tcount < test.length但你的逻辑中也有错误

尝试使用obo一词,它会打印o 2 o 2

计算单词中的字符的简单实现(如果顺序不必像单词中出现的那样)将是

var result = test.Aggregate(new Dictionary<char,int>(), (state,c)=>{
                if(!state.ContainsKey(c)) { state.Add(c,0); }
                state[c] += 1;
                return state;
             });

foreach(var pair in result) { Console.WriteLine(pair.Key + " " + key.Value); }

编辑如果您需要按照与单词中显示的顺序排序,请将foreach更改为

foreach(var pair in result.OrderBy(p=>test.IndexOf(p.Key))) {
   Console.WriteLine(pair.Key + " " + key.Value);
}

答案 1 :(得分:0)

代码包含错误

 int length = test.Length; // This is not zero based

并且count基于零,您的循环将执行一次额外的迭代,导致

 temp = test[tcount]

失败,因为tcount现在变得比测试的长度大1个字符。

最好的办法是

int length = test.Length -1;

请告诉我这是否有帮助:)祝你有愉快的一天

答案 2 :(得分:0)

更多“程序化”版本:

public class Word
{
    private string _inputWord;
    public Word()
    {
        Console.WriteLine("Enter a word");
        _inputWord = Console.ReadLine();
    }

    public void SortAndCount()
    {
        // sort
        char[] array = _inputWord.ToCharArray();
        Array.Sort(array);
        // for all characters
        for(int i = 0; i < array.Length; i++)
        {
            // duplicate check
            if(i > 0 && array[i] == array[i - 1])
                continue;
            // count
            int count = 0;
            for(int j = 0; j < array.Length; j++)
                if(array[i] == array[j])
                    count++;
            Console.WriteLine(array[i] + " " + count);
        }
   }
}

class Program
{
    public static void Main()
    {
        Word obj = new Word();
        obj.SortAndCount();
    }
}

答案 3 :(得分:0)

如果要输出单词中的字母数,请尝试以下代码:

var testString = "APPLE";

testString.ToCharArray()
.OrderBy(i => i).ToLookup(i => i)
.Select(i => new { letter = i.Key, count = i.Count() }).ToList()
.ForEach(i => Console.WriteLine("letter {0}, count {1}", i.letter, i.count));

这样更清晰,更不容易出错。