0

空白行を削除したい、かなり非効率的なC#コードに取り組んでいます。それはこれを行います:

            文字列b;
 ..。
            while(b.IndexOf( "\ n \ n")> = 0)
                b = b.Replace( "\ n \ n"、 "\ n");

1回の置換では、入力の(たとえば)\ n \ n \ nに対応できないため、ループが必要です。私はそれが機能するはずだと思います、そしてそれは通常機能します。

しかし、時にはそれが無限ループに陥ることがあり、その方法がわかりません。反復ごとに\nの数が減るはずなので、最終的には終了するはずです。

何か案は?

4

5 に答える 5

6

これは機能しますか:

String c = Regex.Replace(b, "\n\n+", "\n");
于 2009-07-23T17:24:22.370 に答える
6

説明できない無限ループの説明はありませんが(確かに無限ループですか?文字列が変更されるかどうかを確認しましたか?)、正規表現を使用すると、これをはるかに簡単かつ迅速に行うことができます。

b = System.Text.RegularExpressions.Regex.Replace(b, "\n+", "\n")
于 2009-07-23T17:25:36.970 に答える
0

これが無限ループに陥る文字列の例を挙げていただけますか?また、プログラムをデバッグするには、次のように置き換えてみてください。

while(b.IndexOf("\n\n")>=0)
{
     Console.Write(b)
     Console.Write(b.IndexOf("\n\n").ToString())
     b = b.Replace("\n\n", "\n");
}

そしてそれが何を出力するかを見てください。

于 2009-07-23T17:24:47.283 に答える
0

他の誰かがやって来た場合のポイントを明確にするために、この答えをここに載せています。bが空の文字列の場合、上記のコードは無限にループすることを示唆しています。それは正しくありません:

String b = String.Empty;

Console.WriteLine(b.IndexOf("\n\n"));

// output: -1

ドキュメントには、文字列自体(この場合はb)が空の場合ではなく、渡された値パラメーターIndexOfが空の場合に0を返すと記載されています。

于 2009-07-23T17:45:08.163 に答える
0

私は、ファイルを読み取ることによって得られる厄介な文字列に問題を突き止めました(以下の完全なコード)。

ファイルs.tabには、次の18の16進バイトが含まれています。FFFE 41 00 0D 0A 00 0D 0A 00 0D 0A 00 42 00

これが私のプログラムからのデバッグ出力です:

b.Length=8 loop n=1, i=3, b=A?? 
?? B 
stuck at i=3, b(i)=10 2573 3328... 
done n=1, i=3, b=A?? 
?? B 

したがって、それは無効なユニコードと関係があります。文字列bの文字の10進値をi=3 = IndexOf( "\ n \ n")から出力しました。IndexOfは、10を改行(OK)と見なし、次に2573(0D 0A)を別の行(OKではない?)と見なしているようです。その後、置換は同意しません。

明らかに、ファイル内のデータに問題があります。しかし、私はまだこれが起こるべきではないと思います。IndexOfとReplaceは一致するはずです。

私はmsaeedのソリューションを実装しています。どうもありがとう。

デバッグコード:

        {
            System.IO.StreamReader aFile = System.IO.File.OpenText( @"c:\xfer\s.tab");
            string a = aFile.ReadToEnd();
            aFile.Close();

            int nn=0, ii;
            Console.WriteLine ("a.Length={0}", a.Length);
            while ( (ii=a.IndexOf("\n\n")) >= 0 )
            {
                nn++;
                Console.WriteLine("loop n={0}, i={1}, a={2}"
                    , nn
                    , ii
                    , a);
                if (ii == a.IndexOf("\n\n"))
                {
                    Console.WriteLine ("stuck at i={0}, a(i)={1} {2} {3}..."
                        , ii
                        , (int)(a.ToCharArray()[ii])
                        , (int)(a.ToCharArray()[ii+1])
                        , (int)(a.ToCharArray()[ii+2])
                        );
                    break;
                }
                a = a.Replace ("\n\n", "\n");
            }
            Console.WriteLine("done n={0}, i={1}, a={2}", nn, ii, a);
        }
于 2009-07-24T15:08:15.150 に答える