【问题标题】:My simple prog was repeating, I looked it over and over again...what happened? [duplicate]我的简单前卫在重复,我一遍又一遍地看着它……发生了什么? [复制]
【发布时间】:2021-09-19 06:00:04
【问题描述】:

所以,我对 C# 感到耳目一新。我决定编写一个简单的计算器程序并给我女儿看。我在我的 main 中添加了一个 while 循环,并添加了一个 if 语句以在用户不想重复该过程时中断循环......我为运算符添加了一些方法并在最后添加了一些信息。之后它停止重复,完全跳过从“x = (char)Console.Read();”获取输入线和退出。有用的建议将不胜感激,我仍然是编码的初学者,所以请不要批评我,谢谢。完整代码如下:

  using System;

  namespace TrueCalculator
  {
   class Program
   {
    public static int addition(int num1, int num2)
    {
        int result = num1 + num2;
        return result;
    }
    public static int subtraction(int num1, int num2)
    {
        int result = num1 - num2;
        return result;
    }
    public static int division(int num1, int num2)
    {
        int result = num1 / num2;
        return result;
    }
    public static int multiplication(int num1, int num2)
    {
        int result = num1 * num2;
        return result;
    }
    static void Main(string[] args)
    {
        char x = 'y';
        while (x == 'y' || x == 'Y')
        {
            Console.WriteLine("\t\t\tTrue Calculator\n\t\t    Only uses whole numbers!\n\t\t       ***BETA VERSION***");
            
            Console.WriteLine("Enter first number: ");
            int num1 = Convert.ToInt32(Console.ReadLine());
            
            Console.WriteLine("Enter second number: ");
            int num2 = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Please type desired operator to perform: +, -, /, *");
            char op = (char)Console.Read();

            if (op == '+')
            {
                Console.WriteLine(num1 + " + " + num2 + " = " + addition(num1, num2));
            }
            else if (op == '-')
            {
                Console.WriteLine(num1 + " - " + num2 + " = " + subtraction(num1, num2));
            }
            else if (op == '/')
            {
                Console.WriteLine(num1 + " / " + num2 + " = " + division(num1, num2));
            }
            else if (op == '*')
            {
                Console.WriteLine(num1 + " * " + num2 + " = " + multiplication(num1, num2));
            }

            Console.WriteLine("Reset, y/n?");
            x = Convert.ToChar(Console.Read());

            if (x == 'n' || x == 'N')
            {
                break;
            }
        }
        
        Console.WriteLine("\n\n\t\t\tThank you for using True Calculator\n\nDeveloped by Duster_2015..." + 
            "\nAny comments or suggestions send to: " +
            "FIXME: Enter your Duster email.");
        Console.ReadKey();

    }
}

}

【问题讨论】:

  • 我猜Console.Read() 会离开换行符,而您正在第二次阅读?你可以使用x = Console.ReadLine()[0];
  • 读取缓冲区中可能还有一些字符,例如\n
  • 我试过 Console.ReadLine()[0];但我得到一个例外“超出范围”。如何检查读取缓冲区?
  • 我改变了 x = Convert.ToChar(Console.Read());到 x = (char)Console.Read();只是为了可读性。我仍然没有弄清楚为什么它会完全跳过该行然后自动中断循环并退出。我的意思是我有休息时间;在 if 语句中。
  • 它正在退出循环,因为当您键入 y<enter> 时,控制台缓冲区中有 3 个字符要读取:y \r \n(在 Windows 上)。所以当你第一次调用Console.Read() 你会得到y 并且循环重复。下一次它读取从第一次开始一直坐在那里的\r。由于'\r' != 'y''\r' != 'Y' 循环结束。 Console.ReadLine() 为你消耗和丢弃 \r\n

标签: c# while-loop repeat


【解决方案1】:

(这适用于使用\r\n 换行的Windows。其他系统仅使用\n。)

当程序要求您输入 "+, -, /, *" 并且您输入时

+进入

三个字符被放入控制台的缓冲区:

+\r\n

这些字符一直放在那里,直到您阅读它们(或刷新它们)。当你这样做时

char op = (char)Console.Read();

仅读取这些字符中的 一个。变量op 被分配给'+' 并且 + 从控制台的输入缓冲区中删除,但缓冲区仍然有

\r\n

在里面 - 只是等待阅读。

那么当你这样做时

x = Convert.ToChar(Console.Read());

它在缓冲区中看到 \r 并被读取 立即 - 你没有机会输入任何内容,x 被分配了 '\r' .当循环回滚到开头时,(x == 'y' || x == 'Y') 为 false 并结束。

一种解决方案是不使用Console.Read(),而是使用Console.ReadLine()。这会读取整个输入缓冲区——直到并包括下一个\n——但结果中既不包括\r,也不包括\n。然后你可以使用字符串比较:

string op = Console.ReadLine();
if (op == "+")....

如果你想改用char,你需要检查空字符串:

string op = Console.ReadLine();
if (!String.IsNullOrEmpty(op)) {
    if (op[0] == '+') ....

【讨论】:

  • 感谢@Johnny Mopp 的耐心等待。抱歉,我的帖子是“重复的”,但我不会去寻找简单的答案,我宁愿问一下,让别人向我解释这个问题,这样我就可以学习了。现在太容易了,只用谷歌搜索答案而不用担心理解原因。谢谢你的解释,你让我变得更好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 2020-07-16
相关资源
最近更新 更多