第一次写C#控制台小程序,用来计算输入如45 + 33形式的算术计算,结果碰到数组下标越界问题,郁闷中...
错误://分离出第二操作数
    ->这具有错,索引超出了数组界限。 while (char.IsDigit(exp[idx]))
                 digit += exp[idx++];using System;namespace math_op
{
    class math_op_cls
    {
        
      //简单数学计算程序
        static void Main(string[] args)
        {
            Console.WriteLine("请输入一个算术表达式!");
            string exp = Console.ReadLine();
            int idx = 0;
            
            //去掉首部的所有空格
            while (char.IsWhiteSpace(exp[idx]))
                idx++;            //分离出第一个操作数
            //char c;
            string digit = string.Empty;
            //c = exp[idx];
            while (char.IsDigit(exp[idx]))
                 digit += exp[idx++];
                
            //第一个操作书digit1
            int digit1 = Int32.Parse(digit);            //去掉第一操作数和算符中的空格
            while(char.IsDigit(exp[idx]))
                idx++;            //分离出第一个操作符
            char op1 = exp[idx++];            //去掉算符和第二操作数中的空格
            while (char.IsWhiteSpace(exp[idx]))
                idx++;            digit = string.Empty; 
            //分离出第二操作数
            
                
            
                while (char.IsDigit(exp[idx]))
                
                    digit += exp[idx++];
                
            
            //第二个操作数digit2
            int digit2 = Int32.Parse(digit);            float result = 0;
            switch (op1)
            {
                case '+':
                    result = (float)(digit1 + digit2);
                    break;
                case '-':
                    result = (float)(digit1 - digit2);
                    break;
                case '*':
                    result = (float)(digit1 * digit2);
                    break;
                case '/':
                    result = (float)(digit1 / digit2);
                    break;
                case '%':
                    result = (float)(digit1 % digit2);
                    break;
                    
            }            //display result
            Console.WriteLine("结果为:" + result);
             
        }    }
}

解决方案 »

  1.   

    这样改下即可:
     while (idx<exp .Length && char.IsDigit(exp[idx]))                digit += exp[idx++];
      

  2.   

    比如说你输入"24+32"当idx=4时
    exp[4]='2';
    这时执行digit += exp[idx++];后,digit="32",然后idx++,变成5,再进行下一次循环即:char.IsDigit(exp[5])即超出了范围...所以报错了...
      

  3.   

    你那样做其实还挺麻烦,给你写了个简单点的:            Console.WriteLine("请输入一个算术表达式!");
                string exp = Console.ReadLine();
                string[] str = exp.Split(new char[] { '+', '-', '*', '/' });
                int digit1 = Convert.ToInt32(str[0]);
                int digit2 = Convert.ToInt32(str[1]);
                char op1 = exp.Substring(str[0].Length, 1)[0];            float result = 0;
                switch (op1)
                {
                    case '+':
                        result = (float)(digit1 + digit2);
                        break;
                    case '-':
                        result = (float)(digit1 - digit2);
                        break;
                    case '*':
                        result = (float)(digit1 * digit2);
                        break;
                    case '/':
                        result = (float)(digit1 / digit2);
                        break;
                    case '%':
                        result = (float)(digit1 % digit2);
                        break;            }            //display result
                Console.WriteLine("结果为:" + result);
      

  4.   

    string s = "12 + 34";
                int type=0;
                int i=s.IndexOf('+');
                if (i < 0)
                {
                    i = s.IndexOf('-');
                    if (i < 0)
                    {
                        i = s.IndexOf('*');
                        if (i < 0)
                        {
                            i = s.IndexOf('/');
                            type = 4;
                        }
                        else
                            type = 3;
                    }
                    else
                        type = 2;
                }
                else
                    type = 1;            int num1 = Convert.ToInt32(s.Substring(0, i).Trim());
                int num2 = Convert.ToInt32(s.Substring(i + 1).Trim());
                switch(type)
                {
                    case 1:
                        return num1 + num2;
                        break;
                    case 2:
                        return num1 - num2;
                        break;
                    case 3:
                        return num1 * num2;
                        break;
                    case 4:
                        return num1 / num2;
                        break;
                    default:
                        break;            }            return 0;
      

  5.   

    晕,我写的还不支持有空格的情况...再改下..Console.WriteLine("请输入一个算术表达式!");
                string exp = Console.ReadLine();
                string[] str = exp.Split(new char[] { '+', '-', '*', '/','%' });
                int digit1 = Convert.ToInt32(str[0].Trim());
                int digit2 = Convert.ToInt32(str[1].Trim());
                char op1 = exp.Substring(str[0].Length, 1)[0];            float result = 0;
                switch (op1)
                {
                    case '+':
                        result = (float)(digit1 + digit2);
                        break;
                    case '-':
                        result = (float)(digit1 - digit2);
                        break;
                    case '*':
                        result = (float)(digit1 * digit2);
                        break;
                    case '/':
                        result = (float)(digit1 / digit2);
                        break;
                    case '%':
                        result = (float)(digit1 % digit2);
                        break;            }            //display result
                Console.WriteLine("结果为:" + result);
    这样就OK了..