【问题标题】:How to search for a word in a string in FreeBASIC如何在 FreeBASIC 中搜索字符串中的单词
【发布时间】:2020-03-04 19:13:38
【问题描述】:

我试图在我的 FreeBASIC 程序中创建一个内部函数,我想检查字符串变量“line0”中的单词“echo”,如果“echo”是字符串的一部分,我希望它回显输入(“回声”除外)

【问题讨论】:

  • @BillHileman 确实,这个问题没有表现出努力,因此有资格投票甚至关闭。但是,标题中的问题非常清楚,并且在任何搜索引擎中都会做得很好。如果这篇文章的正文多肉一点,这将是一个体面的问题。我添加了这个迟到的答案,因为我想给出一个关于 BASIC 的 Instr 函数的规范答案。我相信我的回答比大多数手册更深入,也比本论坛上的可用答案更深入。
  • @BillHileman 其他 2 个答案并没有真正回答这个问题。第一个可以写为注释,而另一个误解了实际搜索字符串的事实。 (它只在开头删除了一个词)。实际上,它的所有者删除了另一个答案。这是关于搜索字符串的绝佳答案。可惜我不能投票。

标签: basic freebasic


【解决方案1】:

BASIC 的Instr 函数可以搜索一个字符串并找出它是否包含某个子字符串。如果我们在参数列表中提及该值,它可以从字符串的第一个位置或任何其他位置开始执行此操作。 Instr 返回的结果是查找的字符位置,否则为零表示未找到子字符串。

在编写必须找到某个子字符串的所有出现的算法时,开始位置的可选提及使所有差异。
一旦 Start = 1 Position = Instr(Start, MyString, MySubString) 找到第一个子字符串,我们可以将开始位置移动到刚刚找到的位置并重新开始。我们一直这样做,直到Instr 函数返回零,这告诉我们不再出现子字符串。

Echo asked: What is this echo that echoes in my ear?
^   ^                    ^   ^     ^   ^            ^
1   |                    |   |     |   |            |
+4  5                    |   |     |   |            |
                         26  |     |   |            |
                         +4  30    |   |            |
                                   36  |            |
                                   +4  40           |
                                                    0 "Not found"

直接打印结果的函数

这个 SkipText 函数需要 1 到 3 个参数。第二个和第三个参数是可选的,因为在参数列表中提到了一个默认值。

  • param1 是要搜索的字符串(in)
  • param2 是要搜索的字符串
  • param3 可以限制移除次数
Declare Function SkipText (a As String, b As String = "", c As Integer = 1) As Integer
Dim As String s

s = "Echo asked: What is this echo that echoes in my ear?"

Print "The function outputs directly"
Print " Unmodified: ";
SkipText(s)
Print " Modified*1: ";
SkipText(s, "echo", 1)
Print " Modified*2: ";
SkipText(s, "echo", 2)
Print " Modified*3: ";
SkipText(s, "echo", 3)

GetKey  ' So you can inspect the output

Function SkipText (a As String, b As String, c As Integer) As Integer

    Dim As Integer h, i, j, k

    h = IIf(c < 1, 1, c)  ' Guard against bogus input
    i = 1
    j = 1 + Len(a) - Len(b)
    Do While i <= j
        k = InStr(i, a, b)  ' Case-sensitive
        If k = 0 Then Exit Do
        Print Mid(a, i, k-i);
        i = k + Len(b)  
        h -= 1
        If h = 0 Then Exit Do
    Loop
    Print Mid(a, i)
    Return 0
End Function

返回字符串的函数,调用者可以打印该字符串

Next SkipText 函数需要 1 到 3 个参数。第二个和第三个参数是可选的,因为在参数列表中提到了一个默认值。

  • param1 是要搜索的字符串(in)
  • param2 是要搜索的字符串
  • param3 可以限制移除次数

如果您尝试了上面的代码 sn-p,您会看到第一个“Echo”,即以大写开头的那个,没有被删除。发生这种情况是因为 FreeBasic 的 Instr 始终“区分大小写”。以“不区分大小写”的方式删除的简单解决方案是使用 UCase 函数,例如:
Position = Instr(Start, UCase(MyString), UCase(MySubString))

Declare Function SkipText (a As String, b As String = "", c As Integer = 1) As String
Dim As String s

s = "Echo asked: What is this echo that echoes in my ear?"

Print "The function returns a (reduced) string"
Print " Unmodified: "; SkipText(s)
Print " Modified*1: "; SkipText(s, "echo", 1)
Print " Modified*2: "; SkipText(s, "echo", 2)
Print " Modified*3: "; SkipText(s, "echo", 3)

GetKey  ' So you can inspect the output

Function SkipText (a As String, b As String, c As Integer) As String

    Dim As String t = ""
    Dim As Integer h, i, j, k

    h = IIf(c < 1, 1, c)  ' Guard against bogus input
    i = 1
    j = 1 + Len(a) - Len(b)
    Do While i <= j
        k = InStr(i, UCase(a), UCase(b))  ' Case-insensitive
        If k = 0 Then Exit Do
        t = t + Mid(a, i, k-i)
        i = k + Len(b)  
        h -= 1
        If h = 0 Then Exit Do
    Loop
    Return t + Mid(a, i)
End Function

() 因为这些是 tiny 代码 sn-ps,所以我没有浪费时间选择合理的标识符。在较长的程序中,您应该始终为任何标识符选择有意义的名称。
() FreeBasic 带有一个很好的、全面的手册。如果有什么不明白的,请先查阅手册,然后在这个论坛上提问。

【讨论】:

    【解决方案2】:

    你做过什么研究吗?对不起,但我假设你没有。

    答案是,Basic 语言中已经内置了这个任务的功能。

    您要搜索的函数是“INSTR”。请阅读 FreeBasic 的可用文档。如果您决定尝试编写自己的 INSTR 函数(如果您需要内置函数未提供的功能),请尝试编写代码,如果您遇到困难,我们会尽力提供帮助。

    因此,您描述的任务将包括以下功能:

    INSTR  ' check if the string is here
    LEN    ' to know the length of your search string
    MID    ' to create the 'reduced' output (maybe you will to have it used twice)
    

    【讨论】:

    • 我给出了编写解决方案的提示(所以不是代码编写服务):使用 INSTR 进行搜索,“知道”搜索字符串的 LEN,并使用 MID 函数拆分原始字符串。不要忘记处理特殊情况,当您的搜索字符串是“line0”的开头或结尾时。有人希望投票反对什么?原始帖子没有显示任何研究努力。所以给出的答案应该指导发布者在哪里找到简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多