Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb6 当与空字符串一起使用时,InStr返回1_Vb6 - Fatal编程技术网

Vb6 当与空字符串一起使用时,InStr返回1

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 如

我正在将一些旧的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
如果结束

当调用
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