Vbscript 经典ASP InStr()对空比较字符串求值为True

Vbscript 经典ASP InStr()对空比较字符串求值为True,vbscript,asp-classic,Vbscript,Asp Classic,经典的ASP VbScriptInStr()函数出现问题。如下所示,在非空字符串中搜索空字符串时,对InStr()的第二次调用返回1。我很好奇为什么会这样 ' InStr Test Dim someText : someText = "So say we all" Dim emptyString : emptyString = "" '' I expect this to be true If inStr(1,someText,"so",1) > 0 Then Response.

经典的ASP VbScript
InStr()
函数出现问题。如下所示,在非空字符串中搜索空字符串时,对
InStr()
的第二次调用返回
1
。我很好奇为什么会这样

' InStr Test
Dim someText : someText = "So say we all"
Dim emptyString : emptyString = ""

'' I expect this to be true
If inStr(1,someText,"so",1) > 0 Then
    Response.write ( "I found ""so""<br />" )
End If 

'' I expect this to be false
If inStr(1, someText, emptyString, 1) > 0 Then
    Response.Write( "I found an empty string<br />" )
End If
在某些情况下,可以使用空字符串调用函数
Go()
。最初开发人员的目的不是检查
value
是否为空,而是检查
value
是否等于管道分隔值之一(选项1、选项2等)

进一步考虑一下,每个字符串都是从一个空字符串创建的,这是有意义的,我可以理解为什么编程语言会假设一个删除了所有字符的字符串仍然包含空字符串

对我来说没有意义的是编程语言为什么要实现这一点。考虑这2个陈述:

InStr("so say we all", "s") '' evaluates to 1
InStr("so say we all", "")  '' evaluates to 1
InStr()
函数将返回一个字符串在另一个字符串中第一次出现的位置。在上述两种情况下,结果都是1。但是,位置1始终包含字符“s”,而不是空字符串。此外,对空字符串单独使用另一个字符串函数(如Len()或LenB())将导致0,表示字符长度为0


这里似乎有一些不一致之处。所有字符串中包含的空字符串实际上不是字符,但InStr()函数将其视为一个字符,而其他字符串函数则不是。我觉得这是不直观和不必要的。

我认为这是正确的。至少我认为空字符串是任何其他字符串的一部分。但也许这是一个哲学问题。ASP是这样做的,所以要接受它。实际上,如果您需要不同的行为,请编写您自己的方法InStrNotEmpty或其他方法,该方法在空搜索字符串上返回false。

我不明白您为什么认为这种行为不正确。“abc”是否包含“”?即使是有意义的,答案也必须是“是”:所有字符串都包含空字符串,这只是一个简单的例子。因此,你的“为什么会发生这种情况”问题的答案是因为这是唯一明智的做法。

字符串的答案是:

组或相关组的标识元素I(也表示为E、E或1) 数学结构S是唯一的元素,因此对于 S中的每个元素a。符号“E”源于德语中的 统一,“Einheit.”标识元素也称为单位元素

如果将0添加到数字n,则结果为n;如果将“”添加/连接到字符串s,则结果为:

>> WScript.Echo CStr(1 = 1 + 0)
>> WScript.Echo CStr("a" = "a" & "")
>>
True
True
因此,每个字符串和子字符串至少包含一个“”:

并如实报道。文件甚至指出:

InStr([start, ]string1, string2[, compare])
...
The InStr function returns the following values:
...
string2 is zero-length            start
写你的

但是,位置1始终包含字符“s”,而不是空字符 绳子

==>

位置1始终包含字符“s”,因此为空 还有绳子


嗯。我想如果没有实际意义上的问题,我只是不明白行为的问题是什么。如果
Go()
函数应该检测
value
是否是给定选项之一,那么它的编码严重错误。现在,对于所有不是选项之一的事情,它都会返回True,比如“opt”或“ion”,或者——正如您所发现的——一个空字符串。换句话说,当给它一个空字符串时,它不会出现错误,因为
InStr()
的设计是错误的,而是因为它没有考虑到所有可能的输入。我同意这个函数的糟糕设计。正如我所说,这是我偶然发现并不得不处理的遗留代码。感谢您的详细解释。既然一个空字符串实际上不是一个字符,那么对程序员来说,将空字符串类似于null处理会更有帮助吗?比如,字符串要么是null,要么是空的,要么两者都不是?当一个字符串总是被假定在第一个位置时,我看不到在该字符串中搜索空字符串的实际用途。
>> s = "abc"
>> For p = 1 To Len(s)
>>     WScript.Echo InStr(p, s, "")
>> Next
>>
1
2
3
InStr([start, ]string1, string2[, compare])
...
The InStr function returns the following values:
...
string2 is zero-length            start