我的一个朋友来找我有这种奇怪的行为,我无法解释,任何见解看法,将不胜感激。

进出口运行VS 2005(C#2.0),下面的代码示出了行为

int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());

上面的代码,输出“0”,这清楚地表明它应该有返回-1

这也发生在Java中,其中以下显示类的行为:

public class Test{
 public static void main(String[] args){
   System.out.println("Result->"+("test".indexOf("")));
 }
}

林运行Java 1.6.0_17

有帮助吗?

解决方案

这不是一个例外,而是如何indexOfstartsWith定义的自然结果。

您会声称"test".indexOf("")应返回-1。这基本上相当于声称"test".startsWith("")应返回false。为什么是这样?虽然这种情况下,文档中具体阐述为返回true,这不仅仅是一个任意决定。

你会如何决定"test".startsWith("te"),例如?最简单的方法是使用递归。由于这两个字符串以字符开始't',你叫"est".startsWith("e")并返回结果。同样的,你会打电话给"st".startsWith("")并返回结果。但是,你已经知道答案应该是true,所以这就是为什么每个字符串以""

其他提示

引用从C#文档

  

如果值是时,返回值   是0

这您所描述的行为是完全如预期(至少在C#)。

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

0是正确的。的Javadoc点指出indexOf工作原理如下:

  

返回的整数是最小   值k,使得:

 this.startsWith(str, k)

任意以""串等于原始字符串(和与""每串开始),所以对于k最小str = ""始终为0。

考虑一下这种方式:的IndexOf,寻找一个字符串时,将开始在位置0,尽量匹配字符串,如果它不适合,移动到位置1,2,等等。当你把它用一个空字符串,它试图匹配空字符串与字符串长度0开始在位置0和万岁,没有什么等于零。

边注:有没有真正的理由使用ToString当你使用Console.Write /的WriteLine。该功能会自动调用相关对象的ToString方法。 (除非超载的ToString)

应该返回0您正在寻找一个空字符串的第一次出现,是吧? :)

更多乐趣PHP实际上没有办法做得更好!

php -r "print strpos('test','');"
PHP Warning:  strpos(): Empty delimiter. in Command line code on line 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top