当它应该在C#/ Java中返回-1时,IndexOf方法返回0

时间:2010-04-02 19:12:10

标签: c# java string logic indexof

我的一位朋友带着这种奇怪的行为来找我,我无法解释,任何洞察力的观点都会受到赞赏。

我正在运行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

8 个答案:

答案 0 :(得分:21)

引用C#documentation

  

如果值为Empty,则为返回值   是0。

您描述的行为完全符合预期(至少在C#中)。

答案 1 :(得分:10)

0是正确的。从位置0开始,你可以(平凡地)匹配零长度字符串。同样,“”包含“”。

答案 2 :(得分:10)

这不是规则的例外,而是定义indexOfstartsWith的自然结果。

您声称"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