- PR -

C#のString.IndexOfの仕様

投稿者投稿内容
めー
会議室デビュー日: 2004/07/26
投稿数: 9
投稿日時: 2005-02-04 18:24
文字列を操作する箇所でわからない動作をする箇所がありましたので、
もしわかる方がいらっしゃいましたら教えてください。

以下のような箇所でなぜか無限ループが発生してしまいます。
コード:
// 全角のハイフン
string h = "−";
// ハイフン二つ
string d = h + h;
StringBuilder sb = new StringBuilder("千代田区丸の内一−Oct−〇〇−");
while (sb.ToString().IndexOf(d) != -1) { // ここで見つかったと認識される
    sb.Replace(d, h);          // 実際にはないのでここで変換はされない
}


なぜかこれで無限ループが発生してしまいます。
ステップ実行で見ると、while文の条件内のIndexOfの戻り値が整数(−−が見つかった)
と認識されてしまってるようなのですが、
実際のデータには−−は含まれないのでReplaceでは何も起きなくて、
延々とループになってるようです。
−−に一致してると見なされるのは−と英字の並ぶ辺りなのですが、
−と英字が並んで−−に一致すると見なされるようなことはあるのでしょうか?
また、これは文字コードが何かからんでる問題なのでしょうか?

もしこれの原因に思い当たる方がいらっしゃいましたら、どうぞご教授をお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-02-04 18:44
じゃんぬねっと です。
引用:

StringBuilder sb = new StringBuilder("千代田区丸の内一−Oct−〇〇−");



のラストの「〇−」が原因ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
めー
会議室デビュー日: 2004/07/26
投稿数: 9
投稿日時: 2005-02-04 19:19
>じゃんぬねっと様
早速のご指摘ありがとうございます。
引用:

のラストの「〇−」が原因ですね。


とのことでしたので、"○"と"−"を見てみたところ、上位ビットが同じでした。
この辺りが原因なのでしょうか?

実はまだあまり理解してませんが、ループに回数制限をすればよいと気づいたので、
一応作業は先に進みました。
一息ついたらまた少しつっこんで見てみたいと思います。

ありがとうございました。
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-02-04 20:20
少し実験してみました。

処理結果:
"AA".IndexOf("〇A") => 1
"AA".IndexOf("〇") => 0
"A〇A".IndexOf("AA") => 0
"〇A〇A".IndexOf("AA") => 1
"〇A〇A".IndexOf("〇A") => 0
"〇A〇A".LastIndexOf("〇A") => 3

'〇' という文字はまともに処理されていないような気がするのですが...

Google してみても見つかりませんでしたが、何か特殊な仕掛けが
あるのでしょうか?
Milan
常連さん
会議室デビュー日: 2005/01/05
投稿数: 33
投稿日時: 2005-02-04 20:22
こんにちは。

"〇"文字に問題があるみたいです。(U+3007)
-----------------------------------------------------
string target_text = "千代田区丸の内一−Oct−〇〇−";
target_text.IndexOf("〇"); → 0
target_text.IndexOf(String.Empty); → 0
-----------------------------------------------------
同じ結果返ってきます。

"−〇〇−"の"〇〇"が無視されて"−−"になり
ヒットし無限ループしてるように思います。


[ メッセージ編集済み 編集者: Milan 編集日時 2005-02-06 00:24 ]
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-02-04 20:45
> String.IndexOf(String.Empty);
> と同じ結果(ゼロ)が返ってきます。

なるほど! String.Empty と同じ扱いなんですね!?
...って納得していいんでしょうか...(^^;

1. '〇' が String.Empty と同じ扱いなのは仕様なのでしょうか?
2. "xxx".IndexOf(String.Empty) == 0 は仕様としては正しいのでしょうか?

ご存知の方いらっしゃいますか?
Milan
常連さん
会議室デビュー日: 2005/01/05
投稿数: 33
投稿日時: 2005-02-05 01:07
引用:

1. '〇' が String.Empty と同じ扱いなのは仕様なのでしょうか?
2. "xxx".IndexOf(String.Empty) == 0 は仕様としては正しいのでしょうか?



1は仕様ではないと思います。
 おそらく、IndexOfメソッドのバグなんではないでしょうか。
 LastIndexOf("〇")は正しく値が・・・(間違い、常に最後のIndexが返される)
 
2は仕様です。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemstringclassindexoftopic2.asp


[ メッセージ編集済み 編集者: Milan 編集日時 2005-02-06 00:19 ]
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-02-05 08:35
ありがとうございます。

> おそらく、IndexOfメソッドのバグなんではないでしょうか。

ですよね。こういうときソースが見れないのはつらいところです。

> LastIndexOf("〇")は正しく値が帰ってきます。

"AAA".LastIndexOf"〇") = 2 なので誤っていますね。
IndexOf, LastIndexOf 共 NG です。

> 2は仕様です。

おおっ! 見落としていました。ありがとうございます。

[ メッセージ編集済み 編集者: suz21426 編集日時 2005-02-05 08:37 ]

スキルアップ/キャリアアップ(JOB@IT)