【问题标题】:Visual Basic 2013 - Console Input Tokens?Visual Basic 2013 - 控制台输入令牌?
【发布时间】:2016-04-01 15:37:37
【问题描述】:

我正在尝试从控制台窗口获取用户输入,然后拆分为可以正常使用拆分的数组。我最近读到了关于分裂的文章。我创建了以下数组来检查拆分索引的每个位置的“输入”可能性。但无法弄清楚如何实际检查每个位置的有效输入,更不用说对用户的“命令”做一些事情了。

Dim l1args as Array = {"help","exit","start"} 'first position possibilities
Dim l2args as Array = {"server","exit"} 'second position possibilities

Console.Write("console# ")
Dim input = Console.ReadLine()
Dim tokens As String() = input.Split(CChar(" "))

谁能给我一些指导?我希望能够检查用户输入的组合并对其进行处理。然后,如果不存在任何可能性或已关闭,我想向控制台写入一条错误消息,例如“命令无法识别”......

谢谢....

【问题讨论】:

  • 例如,如果用户输入“启动服务器”,我希望它执行任务 a。如果用户只是输入“开始”,那么我想说,“开始什么?”或错误...如果用户键入“配置服务器”,那么我希望它移动到服务器#而不是控制台#等。任何指导都非常感谢:-)
  • 嗯....我想得越多,我就越需要将每个输入索引的所有可能性都扔到一个多维数组中...
  • 停止使用数组,它完全无助于实现这一点。您可以将词法分析器实现为字典,但这太过分了。支持 KISS,因此这需要 5 分钟而不是一周。
  • 保持简单愚蠢 ;) 如果没有数组或列表,我该怎么办?

标签: vb.net visual-studio input console


【解决方案1】:

这应该是一个“循环算法”。

您应该认为“开始”是获取变量的函数(从什么开始?)。

此变量也是一个命令,因此您需要在启动“启动命令”之前运行它。

例如命令:“开始打印 1” 假设 print 只打印 1,所以基本上你正在做的是获取 print 1 的值(这个值是 1,因为 print 1 只打印 1)然后你会开始 1(如果有,你会开始 1不是 "1" 向用户发送错误消息。

我的做法是这样的:

一个命令有一个名字和它需要的参数数量。 例如,启动命令的名称为“start”,它需要 1 个参数。

或者命令帮助将有一个名称“帮助”并且需要 0 个参数。

或者命令 print 将有一个名称“print”并且需要 1 个参数。

现在假设用户输入了命令“start print chrome” 您将查看第一个单词并看到 start 是一个可识别的命令,所以现在您知道您需要获取它的参数,因此您将转到下一个单词并将其作为命令运行并将结果提供给 start 命令。因此,当转到下一个单词时,您会看到 print 这也是一个可识别的命令,因此您将转到下一个命令以获取 print 命令的参数,现在 chrome 不是可识别的命令,因此您将假定它是值“ chrome"(可以是任何其他字符串,double ...),然后您将使用参数“chrome”运行命令 print,然后您将使用命令 print 的结果运行命令 start。

运行示例:

请求的实现:

这是 vb.net 中的控制台应用程序。 通常我现在将所有类都放在一个文件中,但要将其发布在这里,我必须这样做。

尝试使用命令“print sum 9 10”,这将打印 19

Option Strict On
Option Explicit On
Module Module1
    Public AllCommand As Dictionary(Of String, ConsoleCommand)
    Sub Main()
        GenerateAllCommands()
        Dim UserCommand() As String
        While True
            UserCommand = Console.ReadLine().Split({" "c}, System.StringSplitOptions.RemoveEmptyEntries)
            RunCommand(UserCommand, True, 0)
        End While
    End Sub
    Public Function RunCommand(FullCommand() As String, IsFirst As Boolean, CommandIndex As Integer) As CommandReturnedValue
        If CommandIndex > FullCommand.Length - 1 Then
            Return Nothing
        End If
        Dim CurrentCommand As String
        If FullCommand.Length = 0 Then
            If IsFirst Then
                Console.WriteLine("Error - Empty String is not a valid command")
            End If
            Return New CommandReturnedValue("", CommandIndex)
        End If
        CurrentCommand = FullCommand(CommandIndex).Trim().ToLower()
        If CurrentCommand.Length = 0 Then
            If IsFirst Then
                Console.WriteLine("Error - Empty String is not a valid command")
            End If
            Return New CommandReturnedValue("", CommandIndex)
        End If
        Dim TheCommnad As ConsoleCommand
        If AllCommand.ContainsKey(CurrentCommand) Then
            TheCommnad = AllCommand.Item(CurrentCommand)
            Dim TempArgs(TheCommnad.Args - 1) As CommandReturnedValue
            Dim TempIndex As Integer = CommandIndex + 1
            For i As Integer = 0 To TheCommnad.Args - 1 Step 1
                If TempIndex > FullCommand.Length - 1 Then
                    Console.WriteLine("Error - Need more arguments for """ & TheCommnad.CommandName & """ Command, You entered " & i & " Arguments, This command need " & TheCommnad.Args & " Arguents")
                    Return New CommandReturnedValue("", CommandIndex)
                End If
                TempArgs(i) = RunCommand(FullCommand, False, TempIndex)
                If TempArgs(i) Is Nothing Then
                    Console.WriteLine("Error - Need more arguments for """ & TheCommnad.CommandName & """ Command, You entered " & i & " Arguments, This command need " & TheCommnad.Args & " Arguents")
                    Return New CommandReturnedValue("", CommandIndex)
                End If
                If TempArgs(i).CommandIndex <> -1 Then
                    TempIndex = TempArgs(i).CommandIndex + 1
                Else
                    TempIndex += 1
                End If
            Next
            If TempArgs.Length = 0 Then
                Return TheCommnad.DoCommand(TempArgs, CommandIndex)
            Else
                Return TheCommnad.DoCommand(TempArgs, TempArgs(TempArgs.Length - 1).CommandIndex)
            End If
        Else
            If IsFirst Then
                Console.WriteLine("Error - Unknown Command """ & CurrentCommand & """")
            End If
            Return New CommandReturnedValue(FullCommand(CommandIndex), CommandIndex)
        End If
    End Function
    Public Sub GenerateAllCommands()
        'NOTE - ALL COMMAND MUST BE LOWER CASE
        AllCommand = New Dictionary(Of String, ConsoleCommand)
        AllCommand.Add("help", New HelpCommand())
        AllCommand.Add("start", New StartCommand())
        AllCommand.Add("print", New PrintCommand())
        AllCommand.Add("sum", New SumCommand())
    End Sub
End Module
Public Class CommandReturnedValue
    Public Value As String
    Public CommandIndex As Integer
    Public Sub New(Value As String, Optional index As Integer = -1)
        Me.Value = Value
        Me.CommandIndex = index
    End Sub
End Class
Public MustInherit Class ConsoleCommand
    Public ReadOnly CommandName As String
    Public ReadOnly Args As Integer
    Public Sub New(Name As String, args As Integer)
        Me.CommandName = Name
        Me.Args = args
    End Sub
    Public MustOverride Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue
End Class
Public Class StartCommand
    Inherits ConsoleCommand
    Public Sub New()
        MyBase.New("start", 1)
    End Sub
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue
        If System.IO.File.Exists(AllArgs(0).Value) Then
            Shell(AllArgs(0).Value, AppWinStyle.NormalFocus)
        Else
            Console.WriteLine("Error - Unknown file (Start Command)")
        End If
        Return Nothing
    End Function
End Class
Public Class HelpCommand
    Inherits ConsoleCommand

    Public Sub New()
        MyBase.New("help", 0)
    End Sub
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue
        Console.WriteLine("I see you tryed doing the help commnad ;)")
        Console.WriteLine("Commands: ")
        Console.WriteLine("   Start <FileName> - will try to start the <filename>")
        Console.WriteLine("   help - will show a help list")
        Console.WriteLine("   print <value> - will print (and return) <value>")
        Return New CommandReturnedValue("Help Command", CommandIndex)
    End Function
End Class
Public Class SumCommand
    Inherits ConsoleCommand
    Public Sub New()
        MyBase.New("sum", 2)
    End Sub
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue
        Dim x As Integer
        Dim y As Integer
        Try
            x = Convert.ToInt32(AllArgs(0).Value)
        Catch ex As Exception
            Console.WriteLine("Error - Arguments to sum must be an integer, """ & AllArgs(0).Value & """ is not an integer")
            Return Nothing
        End Try
        Try
            y = Convert.ToInt32(AllArgs(1).Value)
        Catch ex As Exception
            Console.WriteLine("Error - Arguments to sum must be an integer, """ & AllArgs(1).Value & """ is not an integer")
            Return Nothing
        End Try
        Return New CommandReturnedValue((x + y).ToString, CommandIndex)
    End Function
End Class
Public Class PrintCommand
    Inherits ConsoleCommand

    Public Sub New()
        MyBase.New("print", 1)
    End Sub

    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue
        Console.WriteLine("Print Command: """ & AllArgs(0).Value & """")
        Return AllArgs(0)
    End Function
End Class

英语不是我的母语;请原谅我的任何错误。

【讨论】:

  • 这绝对是有道理的。我只是在想用代码写出来的最好方法是什么。 If Then 语句?
  • 您可以为可能的命令创建一个数组或哈希表以提高速度(每个命令都将具有命令的名称、参数的数量和代码(此命令将执行什么操作并返回它获取的参数),然后您只需开始运行命令(由用户输入,拆分为单词)。然后您搜索数组(哈希表)中的第一个单词,如果您找到单词检查它需要多少个参数和也运行它们,如果不是命令返回命令的值。并且您需要有一个卡住,它会告诉您需要返回的位置,开始
  • 随便写个小例子吧:\
  • 非常感谢!
  • 添加实现,创建一个新的 vb.net 控制台应用程序并将代码粘贴到那里,您将能够看到它是如何工作的。您可以使用的命令是“开始”、“帮助”、“打印”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多