我的一位朋友带着这种奇怪的行为来找我,我无法解释,任何洞察力的观点都会受到赞赏。
我正在运行VS 2005(C#2.0),以下代码显示了行为
int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());
上面的代码,打印“0”,清楚地表明它应该返回-1
这也发生在Java中,下面的Class显示了行为:
public class Test{
public static void main(String[] args){
System.out.println("Result->"+("test".indexOf("")));
}
}
我正在运行Java 1.6.0_17
答案 0 :(得分:21)
答案 1 :(得分:10)
0是正确的。从位置0开始,你可以(平凡地)匹配零长度字符串。同样,“”包含“”。
答案 2 :(得分:10)
这不是规则的例外,而是定义indexOf
和startsWith
的自然结果。
您声称"test".indexOf("")
应该返回-1
。这基本上等同于"test".startsWith("")
应该返回false
的声明。为什么是这样?虽然这个案例在文档中被特别称为返回true
,但这不仅仅是一个随意的决定。
例如,您如何决定"test".startsWith("te")
?最简单的方法是使用递归。由于两个字符串都以字符't'
开头,因此您调用"est".startsWith("e")
并返回结果。同样,您将调用"st".startsWith("")
并返回结果。但是你已经知道答案应该是true
,这就是为什么每个字符串都以""
开头。
答案 3 :(得分:6)
0是正确的。 Javadocs指出indexOf
的工作原理如下:
返回的整数是最小的 值k使得:
this.startsWith(str, k)
以""
开头的任何字符串都等于原始字符串(并且每个字符串都以""
开头),因此k
的最小str = ""
始终为0. / p>
答案 4 :(得分:3)
这样想:IndexOf,当找到一个字符串时,将从位置0开始,尝试匹配字符串,如果它不适合,则移动到位置1,2等。当你调用它时如果是空字符串,它会尝试将空字符串与从0位置开始的字符串匹配,长度为0.而且,没有任何东西等等。
附注:当您使用Console.Write / WriteLine时,没有真正的理由使用ToString
。该函数自动调用相关对象的ToString
方法。 (除非重载ToString)
答案 5 :(得分:2)
它应该返回0.你正在寻找第一次出现空字符串,对吧? :)
答案 6 :(得分:1)
只为了它的乐趣。它也像python中那样工作
>>> "test".startswith("")
True
>>> "test".index("")
0
Python抛出一个ValueError而不是-1,这很好。
>>> "test".index('r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
答案 7 :(得分:1)
更有趣的PHP实际上做得更好!
php -r "print strpos('test','');"
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1