2012-08-16 191 views
0

我刚刚在VS2010中开始使用VB,并试图编写一个简单的控制台计算器。但是,我无法让它等待显示输出。即使放置Console.Read()后,控制台窗口也会立即关闭。我猜从我的ReadLine()输入缓冲区仍然有一些有效的字符。我会在这里粘贴代码:清除输入缓冲区:Visual Basic

子的Main()

Dim num1 As Double 
    Dim num2 As Double 
    Dim op As Char 
    Dim ans As Double 

    Console.Write("Enter first number:") 

    num1 = CType(Console.ReadLine(), Double) 

    Console.Write("Enter second number:") 
    num2 = CType(Console.ReadLine(), Double) 

    Console.Write("Enter an operator:") 
    op = ChrW(Console.Read()) 

    Select Case op 
     Case "+" 
      ans = num1 + num2 
      Console.WriteLine("Result=" + ans.ToString()) 

     Case "-" 
      ans = num1 - num2 
      Console.WriteLine("Result=" + ans.ToString()) 


     Case "*" 
      ans = num1 * num2 
      Console.WriteLine("Result=" + ans.ToString()) 

     Case "/" 
      If num2 <> 0 Then 
       ans = num1/num2 
       Console.WriteLine("Result=" + ans.ToString()) 
      Else : Console.WriteLine("Error: Division by zero") 
      End If 

    End Select 

    Console.Read() 

End Sub 

我发现我需要把3 Console.Read()的,在代码的结束,最终得到的控制台等待。这是为什么发生?

+0

我假设你没有收到任何类型的错误消息?如果您尝试'Console.ReadLine()'而不是'Console.Read()?' – Kjartan 2012-08-16 07:49:33

+0

@Kjartan会发生什么?没有错误消息。使用Console.ReadLine()对它没有影响,即它仍然不会等待。 – Karan 2012-08-16 12:25:15

回答

1

尝试加入这个到最后,你会看到发生了什么:

Console.WriteLine(Console.Read().ToString()) 
Console.WriteLine(Console.Read().ToString()) 
Console.Read() 

Console.Read for op is unblocked when you hit return,但回车/换行序列在缓冲区中,没有被消耗掉。因此,两个额外的Console.Read调用清除CR(Dec:13)/ LF(Dec:10),然后像你想要的第三个块。

Console.ReadLine不起作用,因为它消耗CR/LF,并且没有什么可以阻止现有的应用程序。两个Console.ReadLine来电或Console.ReadLine其次Console.Read会工作。

+0

@ jim-oneil准确地说,我得到13和10.那么这是否意味着我必须在每次使用Console.Read()进行输入时编写Console.Read()两次? 谢谢! – Karan 2012-08-17 18:23:39

+0

是的,假设你用另一个阅读来跟踪它,并且你不关心CR/LF。我没有看到flush类型的方法。当然你可以使用ReadLine或者ReadKey来读入操作符 – 2012-08-17 18:58:03