将数组与Instr

时间:2018-08-18 09:40:07

标签: vb6

我正在使用VB6创建一个聊天机器人,并且该聊天机器人的整个基础是,只要用户输入“触发词”(例如“好”,“令人惊讶”等),聊天机器人就会回答“那很棒”。 但是,每当我不写触发字时,只有显示“ Word is in this”的msgbox出现,并且我不知道我在做什么错。我试过弄乱>,<,=符号,但无济于事。任何帮助将不胜感激。

  Private Sub conversation()
    Dim imput As String 'where user types to chatbot

    Dim arrWords As Variant, aWord As Variant
    arrWords = Array("good", "great", "bad")

    Dim wordFound As Boolean
    wordFound = False
    For Each aWord In arrWords
        If InStr(imput, aWord) = 0 Then
            wordFound = True And MsgBox "Word is in this"
        ElseIf InStr(imput, aWord) > 0 Then
            wordFound = False And MsgBox "Word is not in this"
        End If
    Next
End Sub

3 个答案:

答案 0 :(得分:1)

吉姆·马克的答案是正确的;通过添加(在 for 循环之前),我可以使比较更加可靠:

  imput = UCase(imput)

并使测试词数组全部大写。从根本上讲,原始代码仅存在逻辑问题(可能是由于对该语言的误解)。

ElseIf 子句也令人担忧;通常,明智的做法是包含一个明确的 else 子句,以处理所有符合所有先前条件的测试。

答案 1 :(得分:1)

其他答案已经解释了您的逻辑是反向的。

但是,我也不知道您是否正确地复制了代码,但是当我将其复制到VB中时,正如我所期望的那样,我在行中出现MsgBox的语法错误。我可以通过在MsgBox参数中加上括号来“解决”这个问题,例如:wordFound = True And MsgBox("Word is in this"),等等。但这并不是一个好代码,出于我将要解释的原因,我还有其他一些建议。

考虑对代码的以下更改:

Private Sub conversation(theInput As String)

    Dim arrWords As String, aWord As String
    arrWords = Array("good", "great", "bad")

    Dim wordFound As Boolean
    wordFound = False
    For Each aWord In arrWords
        If InStr(theInput, aWord) = 0 Then
            wordFound = False
            MsgBox """" & aWord & """ is in this"
        Else
            wordFound = True 
            MsgBox """" & aWord & """ is not in this"
        End If
    Next
End Sub

Private Sub SendButton_Click()
    conversation(myChatTextBox.Text)
End Sub

好的。这里有几点。

  1. 除非有充分的理由,否则不要使用Variant。这是存储信息的效率最低的方法,因为它必须分配额外的内存以在内部告知变量的类型,并且还必须分配足够的内存以包含可能的最大类型。 (String变量具有10个字节,字符串中每个字符一个,而Variant类型分配为字符串,则具有22个字节,字符串中每个字符一个。)
  2. 我将imput更改为theInputinput是VB中的保留字,因此您不能使用它,但是如果您不拼写错误,对其他人来说更容易理解。最好找到一些前缀放在上面。
  3. 正如其他人所说,当InStr返回零时,这意味着参数2中的字符串不在参数1中的字符串中。因此,这意味着“单词不在此”,并非如此。 (这是您遇到的麻烦的答案;其余的只是为了改善您的代码。)
  4. wordFound = True And MsgBox("Word is in this")仅出于巧合。如果MsgBox成功运行且没有参数,则返回值1。 (谁知道?我必须亲自尝试一下。可能是因为可以将其设置为针对不同类型的ms返回许多不同的值),因此您的逻辑是wordFound = True And 1And是逻辑比较运算符:True And 1的计算结果为True,而False And 1的计算结果为False。因此,您得到了想要的东西,但是很偶然。将两个代码位放在两条不同的行上。您无需进行逻辑比较。实际上,这样做没有任何意义。 (如果您实际上希望将两行代码放在同一行上,请在它们之间加上一个冒号:wordFound = True : MsgBox "etc",但这通常不被认为是一种好习惯,因为该代码的可读性较差。我觉得您认为您正在使用And来执行此操作,如您所见,它所做的事情就大不相同了。
  5. 我更改了您的消息,以将您要查找的词包含在引号中,例如"good" is in this。要在字符串中获取文字引号,请使用其中两个:""。 (您必须将两个引号本身放在引号中,因为它们是用引号引起来的字符串;这就是为什么在开始时有四个,在以后有三个的原因。)
  6. 这里不需要ElseIf,因为如果您的If条件为假,则您的ElseIf条件为true。如果您要评估两个以上的可能条件,则只需要ElseIf
  7. 我已经建立了如何将聊天框用户的输入发送到您的conversation子例程的基本思想。当用户单击Send按钮时,会将文本框的内容作为conversation的参数发送到input。如果将其设置为局部变量,则必须编写某种代码来获取用户输入。这是完成工作的更干净的方法。

话虽如此,您可以像这样进一步简化For Each循环:

For Each aWord In arrWords
    wordFound = InStr(input, aWord) > 0 
    MsgBox """" & aWord & """ is" & IIf(wordFound, "", " not") & " in this"
Next

说明:

  1. InStr(input, aWord) <> 0是对还是错。您将其分配给wordFound。这是一种更简洁的If...Else方法。 (这个想法的简单示例:x = 1 = 1x设置为True,而x = 1 = 0x设置为false。您可以使用括号使其更易于理解:x = (1 = 1)等)
  2. IIf(“即时”)的形式为IIf(condition, valueIfConditionIsTrue, valueIfConditionIsFalse)
  3. 由于wordFound是布尔值,所以说wordFound与说wordFound = True相同,因此您可以省略= True(也可以说{{1} }与Not wordFound的含义相同。

编辑:如果希望聊天机器人在遇到任何一个单词时回复“很棒”,请将wordFound = False从Sub更改为Function并返回true或false。像这样:

conversation()

答案 2 :(得分:0)

我没有尝试运行您的代码-甚至看起来都没有运行-但至少跳出了一个错误。

Arrays

...没有按照您认为的做。您是说 int value = 42; int groups = 5; int residue = value % groups; int[] res = new int[groups]; int division = value / groups; Arrays.fill(res, 0, residue, division +1); Arrays.fill(res, residue, res.length, division); System.out.println(Arrays.toString(res)); 是正确的,只要单词不在输入If InStr(imput, aWord) = 0 Then wordFound = True And MsgBox "Word is in this"' 中,而是仅当MsgBox返回非零结果时

您想要的东西是这样的:

wordFound

对于“未找到”条件,平行条件为真。