控制台不接受控制台写入的数字作为 int。如何解决?

The console does not accept the number written by the console as an int. How to fix it?

我已经学习 C# 大约一个星期了(我没有其他编程经验,所以请多多关照),我正在尝试将计算器作为典型考试的一部分。我的计算器可以很好地处理两个数字,我正在努力让它处理更多的数字。我的想法是在控制台写入第一次计算的结果后重新启动 MyMet。问题:控制台拒绝接受作为 int a 写入的数字并抛出错误。如何解决?

在我提供的这个示例代码中,只有乘法运算说明了我的想法。自该计算器仅适用于两个数字的版本以来,其他操作保持不变。如果我的问题或我的语言看起来很愚蠢,我也深表歉意。我只学了一个星期的 C#,英语不是我的母语。

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {


            void MyMet()
            {
                string[] calc = Console.ReadLine().Split(' ');
                
                int a = int.Parse(calc[0]);
                char b = char.Parse(calc[1]);
                int c = int.Parse(calc[2]);

                switch (b)
                {
                    case '*':
                        Console.Write(a * c);
                        MyMet();
                        
                        break;
                    case '+':
                        Console.WriteLine(a + c);
                        Console.ReadKey();
                        break;
                    case '-':
                        Console.WriteLine(a - c);
                        Console.ReadKey();
                        break;
                    case '/':
                        Console.WriteLine(a / c);
                        Console.ReadKey();
                        break;
                }

               
            }
            MyMet();
        }
    }
}

此示例产生错误:

System.FormatException: "The input string was not in the correct format."

我希望上一次计算的输出始终是下一次计算的第一个输入数字。实现这一点有多容易?

在建议下,我通过调试检查了输入值。调试显示缺少输入值。结论:控制台绝对看不到输入的数字。我在演示该问题的视频中附上了屏幕截图和 link。

视频 link:https://drive.google.com/file/d/1Yzk3mMP6zweZ29y9Jq92fJTg2mypFgfn/view?usp=sharing

如果有人感兴趣,我找到了一个替代解决方案,只是覆盖了变量。我附上程序的最终代码,但我仍在寻找控制台不接受控制台写入的数字的问题的答案以及如何解决它。

class Program

{

    static void Main(string[] args)

    {
        string[] calc = Console.ReadLine().Split(' ');
        double a = double.Parse(calc[0]);
        char b = char.Parse(calc[1]);
        double c = double.Parse(calc[2]);

        void MyMet()
        {
            switch (b)
            {
                case '*':
                    Console.Write(a * c);
                    calc = Console.ReadLine().Split(' ');
                    a = a * c;
                    b = char.Parse(calc[1]);
                    c = double.Parse(calc[2]);
                    MyMet();
                    break;
                case '+':
                    Console.Write(a + c);
                    calc = Console.ReadLine().Split(' ');
                    a = a + c;
                    b = char.Parse(calc[1]);
                    c = double.Parse(calc[2]);
                    MyMet();
                    break;
                case '-':
                    Console.Write(a - c);
                    calc = Console.ReadLine().Split(' ');
                    a = a - c;
                    b = char.Parse(calc[1]);
                    c = double.Parse(calc[2]);
                    MyMet();
                    break;
                case '/':
                    Console.Write(a / c);
                    calc = Console.ReadLine().Split(' ');
                    a = a / c;
                    b = char.Parse(calc[1]);
                    c = double.Parse(calc[2]);
                    MyMet();
                    break;
            }
        }
        MyMet();
    }
}

感谢其中一个答案,我意识到更改变量 a 的值是多么容易。我已将此答案标记为正确,并在有人需要时发布计算器的最终版本。感谢所有回答者和整个 Whosebug 社区。

    static void Main(string[] args)
    {
        void MyMet(double? Result = null)
        {
            string[] calc = Console.ReadLine().Split(' ');

            double a = Result ?? double.Parse(calc[0]);
            char b = char.Parse(calc[1]);
            double c = double.Parse(calc[2]);

            switch (b)
            {
                case '*':
                    Result = a * c;
                    break;
                case '+':
                    Result = a + c;
                    break;
                case '-':
                    Result = a - c;
                    break;
                case '/':
                    Result = a / c;
                    break;
            }
            Console.Write(Result);
            MyMet(Result);
        }
        MyMet();
    }
}

问题是您的一个或多个输入字符串无法解析为整数。字符串值可能是 "1.1" 或者可能是 "!⃅㌜色֕ӐۮΦओ藜䣔睊먈㟕Qx⑜| 23쓁ჃY짷ฎ閅ʼ튟ꓜ z֛"。谁知道。如果您不告诉我们,我们无法知道您输入的字符串是什么。

但是我可以告诉你解决问题需要采取的步骤。

首先,您需要调试代码。在第一个 int.Parse 之前设置一个断点。跳过 (F10) 直到错误被抛出。 现在你知道 calc 的哪个索引有问题了。 运行 再次查看代码并查看 calc[ 有问题的索引 ] 处的值是什么:

很有可能你只需要 运行 一个简单的 string.Trim

这样做

 string input = Console.ReadLine();
 string[] calc = input.Split(' ');

并查看输入包含的内容

Split 行上放置一个断点,以便您可以看到输入的字符串。

看了你的视频后,我明白了问题所在。您输入了

3 * 2

然后在下一行输出

6

然后您按 space 并添加

  • 3

因此在屏幕上看起来像:

6 * 3

这里的混淆是输出不作为输入的双重用途。 6 只是输出,不是输入。所以你第二次提供给计算机的唯一输入是 * 3,所以失败应该是预料之中的。

如果您希望计算器保存上次计算的值以供重复使用,就像普通计算器所做的那样,那么您不能在不重新输入的情况下将其作为 output/input 来回传递。你可能想要的是,因为你有这个作为递归函数,更新你的 MyMet 函数以使用计算结果的可选参数:

void MyMet(int? computedResult = null)

然后对于 a 你只需将它设置为 computedResult 并在第一种情况下将它合并为 a。尚未设置。

a = computedResult ?? char.Parse(calc[0]);

当你进行递归调用时,只需传递计算即可。我还会在递归调用之前移动打印语句:

computedResult = a * c;
Console.Write(computedResult);
MyMet(computedResult);