【问题标题】:Method calling itself not executing fully调用自身的方法未完全执行
【发布时间】:2014-06-01 16:28:01
【问题描述】:

这里有一个简单的例子来说明问题:

class Test
{
    static void PrintName()
    {
        Console.Out.Write("Enter your name: "); 
        string name = Console.In.ReadLine();
        Console.WriteLine(name);

        Console.Out.Write("\nEnter R to restart: ");
        char r = Convert.ToChar(Console.In.Read());

        if (r.ToString().Equals("r", StringComparison.OrdinalIgnoreCase))
            PrintName();
        else
            Environment.Exit(0);

    }

    static void Main(string[] args)
    {
        PrintName();
    }
}

基本上,PrintName 要求重新启动自身。在第一次运行时,它接受用户输入并正常显示名称。当要求重复该过程时,它只会显示提示并询问您是否要重新启动。它跳过等待输入或显示输出。

更新:输出是:

Enter your name: Naven
Naven

Enter R to restart: r
Enter your name:

Enter R to restart: r
Enter your name:

Enter R to restart:

【问题讨论】:

  • 问题出在 Console.Read() 函数上。有关解决方案,请参阅 [this related question][1]。 [1]:stackoverflow.com/questions/6048467/…
  • @Crono 查看我跑步时发生的情况的更新。

标签: c# .net recursion console stdin


【解决方案1】:

这是一种预期的行为。 ReadLine 将读取字符,直到找到 '\n' 另一方面,Read 不会读取 '\n',因此当您读取命令 r 时,您的缓冲区中将有一个 '\n',因此您到达 ReadLine 并直接通过。

所以你必须清理缓冲区,一个简单的ReadLine 就可以做到这一点。

class Test
{
    static void PrintName()
    {
        Console.Out.Write("Enter your name: ");
        string name = Console.In.ReadLine();
        Console.WriteLine(name);

        Console.Out.Write("\nEnter R to restart: ");
        char r = Convert.ToChar(Console.In.Read());

        if (r.ToString().Equals("r", StringComparison.OrdinalIgnoreCase))
        {
            Console.In.ReadLine();
            PrintName();
        }
        else
            Environment.Exit(0);

    }

    static void Main(string[] args)
    {
        PrintName();
    }
}

【讨论】:

  • 非常感谢。我刚刚使用了Console.ReadLine()。使用Console.In.ReadLine() 更好吗?
  • Read 函数的问题在于,当它完成时,它可能会在缓冲区中留下一些字符,这些字符可能会影响您以后的操作。所以如果你使用它,你必须意识到这一点,另一方面,ReadLine 的使用更干净。除了 ReadLine 使用 Read 并确保删除 '\n'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多