【问题标题】:System.FormatException received when while loop added to console calculator将 while 循环添加到控制台计算器时收到 System.FormatException
【发布时间】:2021-09-18 16:55:26
【问题描述】:

我正在用 C# 制作一个控制台计算器,要求用户输入 2 个数字和一个字符。

代码如下:

using System;

namespace Calculator
{
    public static class Calculator
    {
        public static void welcome()
        {
            Console.WriteLine("Welcome to Calculator!");
            Console.WriteLine();
        }

        public static void printResult(int result)
        {
            Console.WriteLine($"Answer: {result}");
        }

        public static void calculate(int num1r, char operr, int num2r)
        {
            int result_b = 0;
            switch(operr)
            {
                case '+':
                    result_b = num1r + num2r;
                    break;
                case '-':
                    result_b = num1r - num2r;
                    break;
                case '*':
                    result_b = num1r * num2r;
                    break;
                case '/':
                    result_b = num1r / num2r;
                    break;
            }
            printResult(result_b);

        }

        public static void askUser()
        {
            Console.WriteLine("Enter a number: ");
            string str1 = Console.ReadLine();
            int num1 = (int)Convert.ToInt32(str1);

            Console.WriteLine("Enter another number: ");
            string str2 = Console.ReadLine();
            int num2 = (int)Convert.ToInt32(str2);

            Console.WriteLine("Enter an operator: ");
            char oper = (char)Console.Read();

            Console.WriteLine();

            calculate(num1, oper, num2);
        }

        public static void Main(string[] args)
        {
            welcome();
            askUser();
        }
    }
}

当我运行这段代码时,控制台看起来像这样:

Welcome to Calculator!

Enter a number:
23424
Enter another number:
5232
Enter an operator:
+

Answer: 28656

我想添加一个 while 循环,以便它可以多次询问用户是否需要输入。所以我在这个程序中添加了一些代码:

using System;

namespace Calculator
{
    public static class Calculator
    {
        public static void welcome()
        {
            Console.WriteLine("Welcome to Calculator!");
            Console.WriteLine();
        }

        public static void printResult(int result)
        {
            Console.WriteLine($"Answer: {result}");
        }

        public static void calculate(int num1r, char operr, int num2r)
        {
            int result_b = 0;
            switch (operr)
            {
                case '+':
                    result_b = num1r + num2r;
                    break;
                case '-':
                    result_b = num1r - num2r;
                    break;
                case '*':
                    result_b = num1r * num2r;
                    break;
                case '/':
                    result_b = num1r / num2r;
                    break;
            }
            printResult(result_b);

        }

        public static void askUser()
        {
            Console.WriteLine("Enter a number: ");
            string str1 = Console.ReadLine();
            int num1 = (int)Convert.ToInt32(str1);

            Console.WriteLine("Enter another number: ");
            string str2 = Console.ReadLine();
            int num2 = (int)Convert.ToInt32(str2);

            Console.WriteLine("Enter an operator: ");
            char oper = (char)Console.Read();

            Console.WriteLine();

            calculate(num1, oper, num2);
        }

        public static void Main(string[] args)
        {
            bool bool1 = true;
            while (bool1 == true)
            {
                welcome();
                askUser();
                Console.WriteLine("Do you want to continue?(y/n only) ");
                switch(Console.Read())
                {
                    case 'y':
                        Console.WriteLine("Ok!");
                    break;
                    case 'n':
                        Console.WriteLine("Thank you for using Calculator!");
                        bool1 = false;
                    break;
                }
            }

        }
    }
}

但现在我得到了一个例外:

System.FormatException: 'Input string was not in a correct format.'

它指向int num1 = (int)Convert.ToInt32(str1);这一行

有关更多信息,我正在使用 Visual Studio。

【问题讨论】:

  • 提示:您的下一个诊断步骤是找出str1 的值。您可以通过在调试器中运行或添加更多诊断控制台输出来做到这一点。我强烈怀疑它包括您在 y/n only 部分之后按下的返回...您的 Console.Read() 只读取一个字符。
  • 我还强烈建议研究 .NET 命名约定并从一开始就开始遵循它们——这比试图“改掉”一个坏习惯更容易。
  • 请注意,您不需要投射(int)Convert.ToInt32(),它已经返回int

标签: c# exception while-loop


【解决方案1】:

你需要做一些这样的改变:

using System;

namespace Calculator
{
public static class Calculator
        {
            public static void welcome()
            {
                Console.WriteLine("Welcome to Calculator!");
                Console.WriteLine();
            }

            public static void printResult(int result)
            {
                Console.WriteLine($"Answer: {result}");
            }

            public static void calculate(int num1r, char operr, int num2r)
            {
                int result_b = 0;
                switch (operr)
                {
                    case '+':
                        result_b = num1r + num2r;
                        break;
                    case '-':
                        result_b = num1r - num2r;
                        break;
                    case '*':
                        result_b = num1r * num2r;
                        break;
                    case '/':
                        result_b = num1r / num2r;
                        break;
                }
                printResult(result_b);

            }

            public static void askUser()
            {
                Console.WriteLine("Enter a number: ");
                string str1 = Console.ReadLine();
                int num1 = (int)Convert.ToInt32(str1);

                Console.WriteLine("Enter another number: ");
                string str2 = Console.ReadLine();
                int num2 = (int)Convert.ToInt32(str2);

                Console.WriteLine("Enter an operator: ");
                char oper = Console.ReadLine()[0];

                Console.WriteLine();

                calculate(num1, oper, num2);
            }

            public static void Main(string[] args)
            {
                bool bool1 = true;
                while (bool1 == true)
                {
                    welcome();
                    askUser();
                    Console.WriteLine("Do you want to continue?(y/n only) ");
                    var continueSt = Console.ReadLine();
                    switch (continueSt)
                    {
                        case "y":
                        case "Y":
                            break;
                        default:
                            Console.WriteLine("Thank you for using Calculator!");
                            bool1 = false;
                            break;
                    }
                }
                Console.WriteLine("Bye!");
                Console.ReadKey();

            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2016-01-08
    • 2015-11-28
    • 2016-01-02
    相关资源
    最近更新 更多