【问题标题】:Why is Visual Basics Console.ReadLine Buggy and can I fix it?为什么 Visual Basics Console.ReadLine 有错误,我可以修复它吗?
【发布时间】:2021-01-20 19:56:12
【问题描述】:

嘿,关于一个视觉基础程序的问题,我正在使用 Console.ReadLine 到一个字符串中,但是当我到达程序的那个部分或我的控制台程序的任何部分时,键盘输入键似乎输入了两次,或者它完全跳过了一些东西一个 ReadLine 并在我有机会输入字符串之前收到 input.length 0。

如果没有我不认为的完整代码,这将无法运行,但我似乎无法让 ReadLine 在最初运行时提示输入字符串,它总是返回 0 一次,然后正常循环。我想知道这是否与我的键盘或视觉基础程序或命令行的键盘设置有关。

我不认为这是键盘错误,因为当我将代码输入到 Visual Basics 中时,它可以正常工作并且不会发送两次返回。我无法获得代码块中的完整代码。

...

Shared Sub Main()
    Dim s As New Space()
    Dim Ship As New Ships()
    Dim Run As Boolean = True
    Dim ChooseName As Boolean = True
    Dim ch As Char
    Dim PlayerName As String

    While Run = True
        s.PrintWelcome()
        ch = Convert.ToChar(Console.Read())
        If ch = "1" Then
            While ChooseName = True
                Console.WriteLine("Choose a Name Less then 50 Characters: ")
                PlayerName = Console.ReadLine()
                If PlayerName.Length > 50 Then
                    Console.WriteLine("Name is to Long!")
                ElseIf PlayerName = "Q" Then
                    Run = False
                    Exit While
                ElseIf PlayerName.Length <= 0 Then
                    Console.WriteLine("Please Enter a Player name or Q by itself to quit.")
                Else
                    ChooseName = False
                    Console.WriteLine("PlayerName: " & PlayerName & " PlayerName.Length: {0}", PlayerName.Length)
                End If
            End While
            If Run = True Then

            End If
        ElseIf ch = "2" Then
        ElseIf ch = "3" Then
            Run = False
        ElseIf ch = "Q" Then
            Run = False
        Else
            s.PrintWelcome()
        End If
    End While
End Sub

...

【问题讨论】:

  • 为什么该方法声明为Shared?如果您创建一个控制台应用程序,那么 IDE 会自动生成一个模块并在其中声明一个 Main 方法。 Shared 关键字在该上下文中无效,因此您必须更改了某些内容。
  • 请阅读this
  • ch = Convert.ToChar(Console.ReadLine().FirstOrDefault())
  • @Jimi,首先,在这种情况下不需要Convert.ToChar。也就是说,考虑到 ch 实际上后来与 String 值进行比较,我建议 ch 实际上应该声明为类型 String 然后应该只是 ch = Console.ReadLine() 或者可能是 ch = Console.ReadLine().TooUpper()。我还建议给ch 取一个合适的名称来描述其用途,几乎所有标识符都应该这样做。
  • Console.ReadLine().FirstOrDefault() 用于吞下回车并只取第一个字符,因此如果用户输入111123,它总是算作1(它处理空字符串输入)。这取决于你想做什么,或者你期望在那里。

标签: vb.net input command-line return console-application


【解决方案1】:

我怀疑你真的应该像这样构建你的代码:

Module Module1

    Sub Main()
        Do
            Console.Write("Please select a menu item from 1, 2, 3 or Q to quit: ")

            Dim menuSelection = Console.ReadKey()
            Dim input As String = Nothing

            Console.WriteLine()

            Select Case menuSelection.KeyChar
                Case "1"c
                    Console.WriteLine("What did you want to say about 1?")
                    input = Console.ReadLine()
                Case "2"c
                    Console.WriteLine("What did you want to say about 2?")
                    input = Console.ReadLine()
                Case "3"c
                    Console.WriteLine("What did you want to say about 3?")
                    input = Console.ReadLine()
                Case "q"c, "Q"c
                    Exit Do
                Case Else
                    'Do nothing before repeating the prompt.
            End Select

            If Not String.IsNullOrEmpty(input) Then
                Console.WriteLine("You said: " & input)
            End If
        Loop
    End Sub

End Module

ReadKey 调用将立即读取用户输入的第一个键。应用程序自己编写换行符,而不是要求用户在该键后按 Enter。然后它测试由该键表示的字符以查看它是否是有效的菜单项。如果是,它会执行适合该项目的任何操作,无论是读取输入行还是退出。如果该键不代表一个有效的菜单项,那么它只是简单地循环回到提示。另请注意,用户输入的Char 值实际上是与Char 文字进行比较的,这是应该这样做的,而不是String 文字。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多