2012-02-14 11 views
2

これは本からのコードです - 第2版「露出プログラミングインタビュー」 - ページ78 - 指定した文字の練習を取り外します(以下に続く)コード運動は

void Main() 
{ 
    string se = "I_am_the_string_to_modify"; 
    string re = "amthe"; 

    Console.WriteLine(se); 
    Console.WriteLine(re); 

    char[] s=se.ToCharArray(); 
    char[] r=re.ToCharArray(); 
    bool[] flags=new bool[128]; 

    int len=s.Length; 
    int src,dst; 

    for(src=0;src<len;++src) 
    { 
     Console.Write(r[src]+","); 
     flags[r[src]]=true; 
    } 

    src=0; 
    dst=0; 

    while(src<len) 
    { 
     if(!flags[(int)s[src]]) 
     { 
      s[dst++]=s[src]; 
     } 
     ++src; 
    } 
    string str=new string(s,0,dst); 
    Console.WriteLine(str); 
} 

私がしようとした場合これを実行するには、18行目のためにIndexOutOfRangeException: Index was outside the bounds of the array.が得られます。著者は26行目と同じ種類のことをしようとしています。ポイントは、削除される文字を識別する検索配列を作成することです。私はこれの作業バージョンがありますが、ネストされた配列インデックスは使用しませんでした。

これが機能する方法はありますか?ネストされた配列がどのように動作するかはわかりません。

答えて

3

あなたの問題はあなたがr(5要素の配列にインデックス付け)が、s.Length(25)にループしていることです。

と20行目をlen=s.Length;に変更してください。

+0

あなたはそれを釘付けにしました。このエラーをWroxに報告します。 – VariableLost

+0

@brock:この回答に同意する必要があります –

4

これはC#プログラムではありません。拡張子.csを持つCソースコードです。

80年代から90年代前半にかけて、CプログラマーがC++を学ぶと、私たちはすべてこれを考えました.Cを考えてC++に移りました。それはC++を学ぶ最悪の方法でした。 C#でそれを行うことはさらに悪いことです。

ここ
Console.WriteLine(string.Concat(se.Where(ch => re.IndexOf(ch) < 0))); 

が、それはいくつかで失敗することがあるので、おそらくあまり良いRegexベースのソリューション(だ:C#でプログラミングする場合、決してC.

FWIWは、ここ.NET 4で問題にLINQ解決策だと思うん再での特殊文字):

Console.WriteLine(new Regex("["+re+"]").Replace(se, ""));