どのように無限ループを交換することができますか?
-
19-09-2019 - |
質問
私は、空白の行を削除したいいくつかのむしろ非効率的なC#のコードに取り組んでいます。これは、これを行います:
string b; ... while ( b.IndexOf("\n\n") >= 0 ) b = b.Replace ("\n\n", "\n");
置き換える単一の(例えば)\ n \ n \ n個の入力に対処しないことになるので、ループが必要です。私はそれを動作させるべきだと思うし、それは通常ありません。
しかし、時にはそれが無限ループに入るために管理し、私はどのように理解していません。最終的に終了させるために、それはあるべきように、反復ごとに\ nの数は、減らす必要があります。
任意のアイデア?
解決
でしょう。この作品ます:
String c = Regex.Replace(b, "\n\n+", "\n");
他のヒント
私は(??あなたは、それは無限だ確信しているあなたは、文字列の変更かどうかを確認するために点検した)あなたの不可解な無限ループの説明を持っていませんが、正規表現をはるかに簡単かつ迅速にこれを行うことができます:
b = System.Text.RegularExpressions.Regex.Replace(b, "\n+", "\n")
あなたは、これが無限ループに入っているため、文字列の例を与えることができますか?また、あなたのプログラムをデバッグするためにあなたがとそれを交換してみます。
while(b.IndexOf("\n\n")>=0)
{
Console.Write(b)
Console.Write(b.IndexOf("\n\n").ToString())
b = b.Replace("\n\n", "\n");
}
と、それは出力か見ます。
私はちょうど他の誰が一緒に来て、bは空の文字列である場合は、上記掲載のコードはループを無限になることを示唆している場合のポイントを明確にするために、ここでこの答えを入れています。それは間違っています:
String b = String.Empty;
Console.WriteLine(b.IndexOf("\n\n"));
// output: -1
IndexOf
が値ならば0を返すことを述べての 私は、ファイル(以下、フルコード)を読み取ることによって、私が手に厄介な文字列に問題を釘付けにしています。
FF FE 41 00 0D 0A 00 0D 0A 00 0D 0A 00 42 00s.tabこれらの18進バイトを含むファイル
ここに私のプログラムからのデバッグ出力されます:
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
だから、無効なユニコードとは何かです。私は私= 3 = IndexOfメソッド(「\ n個の\ nを」)から始まる、列bの文字の小数点以下の値をプリントアウトしてきました。 IndexOfメソッドは、(OKではない?)別として(0D 0Aである)改行(OK)として10を参照して、2573年のようです。そして、一致しない置き換えます。
明らかに、ファイル内のデータに問題があります。しかし、私はまだこれが起こらなければならないとは思いません。 IndexOfメソッドと置き換えが同意するはずます。
私は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);
}