C# String.IndexOfのバグですか?

このQ&Aのポイント
  • C#のString.IndexOfメソッドに関して、異なる引数での挙動に疑問があります。
  • 特に、指定した位置からの検索において、正しい結果が得られない場合があります。
  • この挙動はバグと考えられるのでしょうか?
回答を見る
  • ベストアンサー

C# String.IndexOfのバグですか?

C# String.IndexOfのバグですか? 非常に単純なコード String s = ",a,b,c,d,e"; int left; left = s.IndexOf(',', 0, 1); Console.WriteLine(left.ToString ()); left = s.IndexOf(',', 0, 2); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 1); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 2); Console.WriteLine(left.ToString()); 結果: 0 0 -1 2 もしかして、バグですか???

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

引数の意味は理解されてますか?特に第2と第3。 一つ目、二つ目は「第0インデックスから1文字/2文字検索した結果」 三つ目は「第1インデックスから1文字検索した結果」 四つ目は「第1インデックスから2文字検索した結果」 ですから全て正常な結果ですけど。

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms131434(VS.80).aspx
get_star
質問者

補足

ご回答ありがとうございました。 C#を使い始めたばかりですので、IndexOfのパラメータの意味を勘違いしてしまいました。 第三パラメータcountを検索の回数だと思い込んでしまいました。 失礼しました!

関連するQ&A

  • C#のToString("c")

    C#で、テキストボックスに金額を記入し、のちに取り出して数値として使いたいのですが、ToString("c")でフォーマットして記入した場合は通貨記号が取れませんでした。 なぜでしょうか? 何か良い方法がありますでしょうか? よろしくお願いいたします。 //ToString("c")を使わないで記入した場合 textBox1.Text = "-\\12345"; string stTarget; stTarget = textBox1.Text; Console.WriteLine("1stTarget=" + stTarget); stTarget = stTarget.Replace(",", ""); Console.WriteLine("2stTarget=" + stTarget); stTarget = stTarget.Replace("\\", ""); Console.WriteLine("3stTarget=" + stTarget); //出力結果 //1stTarget=-\12,345 //2stTarget=-\12345 //3stTarget=-12345 //ToString("c")を使って記入した場合 int tempNum = -12345; textBox1.Text = tempNum.ToString("c"); stTarget = textBox1.Text; Console.WriteLine("1stTarget=" + stTarget); stTarget = stTarget.Replace(",", ""); Console.WriteLine("2stTarget=" + stTarget); stTarget = stTarget.Replace("\\", ""); Console.WriteLine("3stTarget=" + stTarget); //出力結果 //1stTarget=-\12,345 //2stTarget=-\12345 //3stTarget=-\12345

  • C#で char型とstring型の比較で Equalsでハマりました。 

    C#で char型は値型でstring型は参照型ですがこの比較を正しく行うにはどうしたらよいでしょうか? string s = "0123456789"; Console.WriteLine(s[0]); Console.WriteLine("0".Equals(s[0]) ? "true" : "false"); で、falseなのは驚きでした。 Equalsを鵜呑みにしていました。 コンパイルできたので今まで気づきませんでした。 詳しい方、教えて頂けますか?

  • C#で独自の型を定義したい

    C# 2010 version 4.0を使用しています。 次のようなint型とstring型を混合したMixedという型を定義したいのですが、 public class Mixed { private int _TheInt = 0; public int TheInt { get { return _TheInt; } set { _TheInt = value; } } private string _TheString = null; public string TheString { get { return _TheString; } set { _TheString = value; } } public static implicit operator int(Mixed m) { return m.TheInt; } public static implicit operator Mixed(int x) { Mixed m = new Mixed(); m.TheInt = x; return m; } public static implicit operator string(Mixed m) { return m.TheString; } public static implicit operator Mixed(string x) { Mixed m = new Mixed(); m.TheString = x; return m; } } //Mixed m = 1; //Console.WriteLine(m); //これだとコンパイルエラーになる //Console.WriteLine(m.TheInt.ToString()); //「1」と表示される int i = 1; Console.WriteLine(i); //「1」と表示される object o = 1; Console.WriteLine(o); //「1」と表示される Console.WriteLineなどで表示する場合に 例えばint型なら int i = 1; Console.WriteLine(i); //「1」と表示される という具合にそのまま「1」と表示されます。 でもこのMixedの場合、 Mixed m = 1; Console.WriteLine(m.TheInt.ToString()); //「1」と表示される これでは「1」と表示されるのですが、 Console.WriteLine(m); //これだとコンパイルエラーになる このやり方だとエラーになります。 なんとかしてint型やobject型のようにToString()を使わずに 表示させることはできないでしょうか?

  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • C#で、リンク先の画像自動保存を実現させたい

    こんにちは 僕はC、C++をある程度勉強しているのですが、タイトルのようにリンク先の画像保存を行うには、C#が一番のようなので、必死に手さぐりでコードを書いています。 実現したい内容は、連番のURL先の画像を自動保存する、というプログラムです。 http://001.jpg http://002.jpg http://003.jpg . . . といったURLを、基本のURL、桁数、開始値、終了値を入力し、自動的にアクセス、保存させたいわけです。 こちらがコードになります。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace aaa { class Program { static void Main(string[] args) { string s; string url = System.Console.ReadLine(); Console.WriteLine("書式"); string frm = Console.ReadLine(); Console.Write("開始値;"); int start = int.Parse(Console.ReadLine()); Console.Write("終了値;"); int end = int.Parse(Console.ReadLine()); for (int i = start; i <= end; i++) { s = i.ToString(); System.Net.WebClient wc = new System.Net.WebClient(); wc.DownloadFile(url.Replace(url, i.ToString(frm)), @"【ここには保存させたいフォルダのパスを入れます】" + s + ".jpg"); wc.Dispose(); Console.WriteLine(url, i.ToString(frm)); } } } } 例のURLを使うなら、入力は http://{0}.jpg 0 1 10(仮) です。 これで動くように作ったつもりなんですが、終了値入力終了後、エラーが出てきてしまいます。 コンパイラ側で 「WebExceptionはハンドルされませんでした」 「ファイル`C:\Users\【僕のユーザー名】\AppData\Local\Temporary Projects\Project\bin\Debug\1'が見つかりませんでした」 というものです。 どうかC#に慣れている方ご教授ください。 当方は、プログラミングの基礎知識はありますが、素人で、かつC#に関する知識はほぼゼロです。 メソッドやクラス等の書式も根本的に勘違いしている可能性もあります。すみません。 出来れば、具体的な改善ソースを掲示して頂くか、分かりやすく噛み砕いた説明の方をお願いしたいです。

  • 型の種類に関係なく配列かどうかを調べたい

    C# 2010 version 4.0を使用しています。 例えば以下のコードでは、 object o = new int[]{1, 2}; if (o is int[]) { Console.WriteLine("配列"); } 「o is int[]」 と調べれば良いのですが、 object o がstring型の配列だろうが object o = new string[]{“a”, “b”}; object o がdouble型の配列だろうが object o = new string[]{1.1, 1.2}; とにかく配列かどうかを調べるやり方なり関数はあるのでしょうか? やはり object o = new string[]{"a", "b"}; if (o is int[]) { Console.WriteLine("配列"); } else if (o is string[]) { Console.WriteLine("配列"); } このように調べる方法しかないのでしょうか?

  • [言語C#] string型における参照値の受け渡し

    stringは、参照型に分類されると思います。・・・(1) 【string宣言部抜粋】 public sealed class String : IComparable, ICloneable...... また、参照変数の代入では、オブジェクトの参照値が受け渡されるという認識です。・・・(2) 上記(1)、(2)を踏まえると、次のプログラムの実行結果に納得がいきません。 string aiu = "aiu"; string aiue = aiu; Console.WriteLine(aiue); aiu = "abc"; Console.WriteLine(aiu); Console.WriteLine(aiue); 出力結果---------- aiu abc aiu ------------------ (1)、(2)の考えを取り入れた場合、出力結果は aiu abc abc になるものだと思いましたが、なぜこのような結果になるのでしょうか 。自作クラスで似たような処理を行った場合では、一方の変更が同じインスタンスを代入した他方へも影響することは確認済みです。 ただ、stringの場合では・・・違うみたいです。 初歩的なことだと思いますが、宜しくお願い致します。

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • C++ ファイル列挙について

    以下のコードで指定のファイルを検索し、フルパスで配列に格納しています。 このとき、ファイル名のみ(パスと拡張子無し)で格納する方法はありますでしょうか。 どうかよろしくお願いします。 // enum_files.cpp // compile with: /clr using namespace System; using namespace System::IO; int main() { String^ folder = "C:\\"; array<String^>^ dir = Directory::GetDirectories( folder ); Console::WriteLine("--== Directories inside '{0}' ==--", folder); for (int i=0; i<dir->Length; i++) Console::WriteLine(dir[i]); array<String^>^ file = Directory::GetFiles( folder ); Console::WriteLine("--== Files inside '{0}' ==--", folder); for (int i=0; i<file->Length; i++) Console::WriteLine(file[i]); return 0; }

  • C#のメンバ変数について

    下記のコードで enterName の変数を static void Resurut() のメソッドへの受け渡しが上手くいかず、どなたか修正点を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string enterName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); Start(); Resurut(); } *一部省略 static void Resurut() { if (cntWin > cntLose) { Console.WriteLine("{0}さんの総合勝利です", enterName); } else if (cntLose > cntWin) { Console.WriteLine("CPUの総合勝利です"); } else if (cntWin == cntLose) { Console.WriteLine("引き分けです"); } } }

専門家に質問してみよう