7

我的一个朋友带着这种我无法解释的奇怪行为来找我,任何洞察力的观点都将不胜感激。

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

4

8 回答 8

21

引用 C#文档

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

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

于 2010-04-02T19:14:09.587 回答
11

0 是正确的。从零位置开始,您可以(通常)匹配一个长度为零的字符串。同样,“”包含“”。

于 2010-04-02T19:13:56.590 回答
10

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

您声称"test".indexOf("")应该返回-1。这本质上等同于"test".startsWith("")应该返回的声明false。为什么是这样?虽然这种情况在文档中特别提到为返回true,但这不仅仅是一个任意的决定。

"test".startsWith("te")例如,您将如何决定?最简单的方法是使用递归。由于两个字符串都以字符开头,因此't'您调用"est".startsWith("e")并返回结果。同样,您将调用"st".startsWith("")并返回结果。但是您已经知道答案应该是true,所以这就是每个字符串都以 . 开头的原因""

于 2010-04-02T20:03:11.123 回答
6

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

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

 this.startsWith(str, k)

任何以 开头的字符串""都等于原始字符串(并且每个字符串都以 开头""),因此最小k的 forstr = ""始终为 0。

于 2010-04-02T19:15:04.057 回答
3

可以这样想:IndexOf,在查找字符串时,将从位置 0 开始,尝试匹配该字符串,如果不合适,则移动到位置 1、2 等。当您使用空调用它时字符串,它尝试将空字符串与从位置 0 开始、长度为 0 的字符串匹配。万岁,没有什么等于没有。

旁注:ToString当您使用 Console.Write/WriteLine 时,没有真正的使用理由。该函数会自动调用相关ToString对象的方法。(除非重载 ToString)

于 2010-04-02T19:18:51.727 回答
2

它应该返回 0。您正在寻找空字符串的第一次出现,对吗?:)

于 2010-04-02T19:15:18.700 回答
1

更有趣的 php 实际上做得更好!

php -r "print strpos('test','');"
PHP Warning:  strpos(): Empty delimiter. in Command line code on line 1
于 2010-04-03T05:55:03.753 回答
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
于 2010-04-03T01:38:26.347 回答