我正在尝试在我的 FreeBASIC 程序中创建一个内部函数,我想在字符串变量“line0”中检查单词“echo”,如果“echo”是字符串的一部分,我希望它回显输入(除了“回声”)
2 回答
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 是要搜索的字符串(输入)
- 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 是要搜索的字符串(输入)
- param2 是要搜索的字符串
- param3 可以限制移除次数
如果您尝试了上面的代码片段,您会看到第一个“Echo”,即以大写开头的那个,没有被删除。发生这种情况是因为 FreeBasicInstr
始终“区分大小写”。以“不区分大小写”的方式删除的简单解决方案是使用如下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
() 因为这些都是很小的代码片段,所以我没有浪费时间选择合理的标识符。在较长的程序中,您应该始终为任何标识符选择有意义的名称。
() FreeBasic 带有一个很好的、全面的手册。如果有什么不清楚的,请先查阅手册,然后在这个论坛上提问。
你做过什么研究吗?对不起,但我假设你没有。
答案是,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)