Vb6 当与空字符串一起使用时,InStr返回1
我正在将一些旧的VB6代码迁移到C#目前,我正在用VB代码测试我的C#代码,以检查每种语言中对应的方法是否返回相同的值 我对这个if语句有问题:Vb6 当与空字符串一起使用时,InStr返回1,vb6,Vb6,我正在将一些旧的VB6代码迁移到C#目前,我正在用VB代码测试我的C#代码,以检查每种语言中对应的方法是否返回相同的值 我对这个if语句有问题: If InStr(1, "LPTVJY", strTempTaxCode) <> 0 Then strTempTaxCode = "0" & strTempTaxCode End if 如果InStr(1,“LPTVJY”,stremptaxcode)为0,则 stremptaxcode=“0”&stremptaxcode 如
If InStr(1, "LPTVJY", strTempTaxCode) <> 0 Then
strTempTaxCode = "0" & strTempTaxCode
End if
如果InStr(1,“LPTVJY”,stremptaxcode)为0,则
stremptaxcode=“0”&stremptaxcode
如果结束
当调用
InStr(1,“LPTVJY”,strTempTaxCode)
时,返回值1
。为什么会这样?据我所知,我应该返回0
,因为在VB中,“LPTVJY”
中的所有字符都不在stremptaxcode中,字符串是基于1的。因此,当省略时,“开始”(要从中搜索的开始位置)的默认值为1
当string2(您搜索的字符串)的长度为零或为零时,InStr返回start*1),这是在您的案例1中
*(一)
由于“LPTVJY”
中的任何字符都不在stremptaxcode
范围内,因此该短语表明您误解了该函数。它在string1中搜索string2。文档中提到了很多边缘情况以及函数在这种情况下返回的内容。然而,函数可能比这个简单得多,并且可以编写为嵌套循环,大致如下(唯一的内部优化方式)
对于s=从开始到Len(string1)-开始
对于c=1至Len(string2)
"字外"。没有对手。
如果c+s-1>Len(string1),则返回0
“不匹配。请重试获取下一个“s”值。
如果SubStr(string1,c+s-1)SubStr(string2,c),则退出
下一个
下一个
“如果你到了这里,就会在位置s找到一个匹配项。
返回s
请将上述代码视为伪代码。这只是为了解释,我不知道它是否真的有效。在VB中,字符串是基于1的。因此,当省略时,“开始”(要从中搜索的开始位置)的默认值为1
当string2(您搜索的字符串)的长度为零或为零时,InStr返回start*1),这是在您的案例1中
*(一)
由于“LPTVJY”
中的任何字符都不在stremptaxcode
范围内,因此该短语表明您误解了该函数。它在string1中搜索string2。文档中提到了很多边缘情况以及函数在这种情况下返回的内容。然而,函数可能比这个简单得多,并且可以编写为嵌套循环,大致如下(唯一的内部优化方式)
对于s=从开始到Len(string1)-开始
对于c=1至Len(string2)
"字外"。没有对手。
如果c+s-1>Len(string1),则返回0
“不匹配。请重试获取下一个“s”值。
如果SubStr(string1,c+s-1)SubStr(string2,c),则退出
下一个
下一个
“如果你到了这里,就会在位置s找到一个匹配项。
返回s
请将上述代码视为伪代码。这只是为了解释,我不知道它是否真的有效。所有长度非零的字符串,包括单个字符串,都包含空字符串
Debug.Print InStr("abc", "") ' => 1
Debug.Print InStr("a", "") ' => 1
Debug.Print "abc" & "" = "abc" ' => True
如果你把脑袋绕在这个概念上有困难,想想所有数字都有1个因子:
' (not a real function)
Debug.Print Factors(2) ' => 1, 2
Debug.Print 2 * 1 = 2 ' => True
这被称为乘法恒等式属性。您可以认为字符串具有与空字符串类似的标识属性
Debug.Print InStr("abc", "") ' => 1
Debug.Print InStr("a", "") ' => 1
Debug.Print "abc" & "" = "abc" ' => True
如果不希望InStr()
匹配空字符串,请在调用它之前进行初步测试:
If Len(strTempTaxCode) > 0 Then
If InStr(1, "LPTVJY", strTempTaxCode) <> 0 Then
strTempTaxCode = "0" & strTempTaxCode
End If
End If
如果Len(strTempTaxCode)>0,则
如果指令(1,“LPTVJY”,strTempTaxCode)为0,则
stremptaxcode=“0”&stremptaxcode
如果结束
如果结束
所有长度非零的字符串(包括单个字符串)都包含空字符串
Debug.Print InStr("abc", "") ' => 1
Debug.Print InStr("a", "") ' => 1
Debug.Print "abc" & "" = "abc" ' => True
如果你把脑袋绕在这个概念上有困难,想想所有数字都有1个因子:
' (not a real function)
Debug.Print Factors(2) ' => 1, 2
Debug.Print 2 * 1 = 2 ' => True
这被称为乘法恒等式属性。您可以认为字符串具有与空字符串类似的标识属性
Debug.Print InStr("abc", "") ' => 1
Debug.Print InStr("a", "") ' => 1
Debug.Print "abc" & "" = "abc" ' => True
如果不希望InStr()
匹配空字符串,请在调用它之前进行初步测试:
If Len(strTempTaxCode) > 0 Then
If InStr(1, "LPTVJY", strTempTaxCode) <> 0 Then
strTempTaxCode = "0" & strTempTaxCode
End If
End If
如果Len(strTempTaxCode)>0,则
如果指令(1,“LPTVJY”,strTempTaxCode)为0,则
stremptaxcode=“0”&stremptaxcode
如果结束
如果结束
发生这种情况的原因是,根据,如果要搜索的字符串(即本例中的stremptaxcode)长度为零,则函数的返回值是可选的start
参数的值(即开始搜索的索引,在本例中省略)。当ommitted时,它的值不一定是1,而是字符串中要搜索的第一个字符位置(恰好是1,因为“LPTVJY”
中的第一个字符位置是第一个)
之所以出现这种情况,是因为所有长度非零的字符串(包括单个字符串)都包含空字符串,或者正如其他人所指出的那样,start
参数的默认值为1,因为它们不包含空字符串,而不是空字符串。要测试此功能,请尝试运行:
Debug.Print InStr(2, "abc", "") ' Returns 2, i.e. the start position
Debug.Print InStr(-13, "abc", "") ' Returns -13, i.e. the start position
Debug.Print InStr(-1, "abc", "") ' Returns -1, i.e. the start position
Debug.Print InStr(0, "abc", "") ' Returns 0, i.e. the start position
Debug.Print InStr(2, "", "") ' Returns 0, i.e. the first character position in ""
如果第二个字符串非空(它将引发错误5:“无效的过程调用或参数”),则这将不起作用,但这足以证明,在要搜索的长度为零的字符串的情况下,函数的返回值与要搜索的字符串中包含的字符串无关,或者start
的值默认为1,而是与结果与start
参数的值无关(即使是在最后一个测试用例中,由于要搜索的空字符串中的第一个字符位置也是0,所以它被强制为0)
最快的解决方案可以是:
•对于if..then..else
语句,使用附加条件,如所述:
•f