【问题标题】:Console.ReadLine() skips the first input characterConsole.ReadLine() 跳过第一个输入字符
【发布时间】:2013-05-01 05:09:21
【问题描述】:
Console.WriteLine("You have not installed Microsoft SQL Server 2008 R2, do you want to install it now? (Y/N): ");
//var answerKey = Console.ReadKey();
//var answer = answerKey.Key;
var answer = Console.ReadLine();
Console.WriteLine("After key pressed.");
Console.WriteLine("Before checking the pressed key.");

//if(answer == ConsoleKey.N || answer != ConsoleKey.Y)
if (string.IsNullOrEmpty(answer) || string.IsNullOrEmpty(answer.Trim()) || string.Compare(answer.Trim(), "N", true) == 0)
{
    Console.WriteLine("The installation can not proceed.");
    Console.Read();
    return;
}

我已尝试输入这些:

  • y -> 它给了我一个空字符串,
  • y(whitespace+y) -> 它给了我“y”

我查看了其他类似的帖子,但没有一个能解决我的问题。 ReadLine() 仍然会跳过第一个输入字符。

更新已解决,see below

【问题讨论】:

  • 请查看这篇文章。它将解释您的问题stackoverflow.com/questions/3800343/…
  • 我在 Ideone.com 上试过,没有任何问题 (ideone.com/1MSBMb)。您使用的是哪个版本的 .NET?
  • 其他读者注意:从下面@Franva的回答来看,问题似乎不完整......
  • @DanPuzey Hi Dan,请指出这个问题遗漏了哪一部分,谢谢
  • @Franva:您没有解释说您在单独的线程中运行代码,这显然是罪魁祸首。没有这些知识的回答永远不会给你任何有用的东西。

标签: c#


【解决方案1】:

建议更改:

Console.Write("Enter some text: ");
String response = Console.ReadLine();
Console.WriteLine("You entered: " + response + ".");

关键点:

1) 字符串可能是最容易处理的控制台输入类型

2) 控制台输入是面向行的 - 您必须在输入对程序可用之前键入“Enter”。

【讨论】:

  • 这与发布的内容有何不同?您所做的只是显式键入变量。
【解决方案2】:

感谢大家回复我的帖子。

在我的代码中没有考虑多线程特性是我的错。我会尝试解释我错在哪里,以感谢您的所有回复。

BackgroundWorker worker = .....;
  public static void Main(string[] args)
    {
        InitWorker();
        Console.Read();
    }

public static void InitWorker()
{
    ....
    worker.RunWorkerAsync();
}


static void worker_DoWork(....)
{
  .....this is where I wrote the code...
}

问题是我启动了一个与主线程异步运行的子线程。当子线程跑到这一行时: var answer = Console.ReadLine(); 主机线程运行到 Console.Read();同时。 所以发生的事情是,看起来我正在为 var answer = Console.ReadLine(); 输入一个字符,但它实际上馈送到了在主机线程上运行的 Console.Read(),然后轮到 sub-线程到 ReadLine()。当子线程得到键盘输入时,第一个输入的字符已经被主线程取走,整个程序结束并关闭。

我希望我的解释清楚。

【讨论】:

  • 现在说得通了。我相信你可以使用Application.Run() 来防止在你的主要结束时退出。
【解决方案3】:

基本上你需要改变 Console.Read --> Console.ReadLine

【讨论】:

  • 我还编译了你的代码并对其进行了测试,我得到的值与我输入的值相同,我也在我的 Linux 机器上使用 Mono。
  • 很高兴它成功了。我有点担心想知道为什么您的原始代码会起作用。 Yah Good'ol 线程 :)
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 2016-07-27
  • 2013-03-04
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多