문제

공백 라인을 제거하려는 다소 비효율적 인 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을 반환합니다 매개 변수 문자열 자체 (이 경우 B)가 비어있는 경우가 아니라 비어 있습니다.

파일을 읽음으로써 얻는 불쾌한 문자열에 문제를 고정했습니다 (아래 전체 코드).

파일 s.tab은이 18 개의 16 진 바이트를 포함합니다.

내 프로그램의 디버그 출력은 다음과 같습니다.

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 

따라서 유효하지 않은 유니 코드와 관련이 있습니다. i = 3 = indexof ( " n n")에서 시작하여 문자열 B의 문자 값을 인쇄했습니다. Indexof는 10을 Newline (OK), 2573 (0D 0A)으로 보는 것 같습니다 (OK가 아닌). 그런 다음 교체는 동의하지 않습니다.

분명히 파일의 데이터에 문제가 있습니다. 그러나 나는 여전히 이것이 일어날 것이라고 생각하지 않습니다. 지수와 교체는 동의해야합니다.

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);
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top