2009-07-23 7 views
0

빈 줄을 제거하려는 다소 비효율적 인 C# 코드를 작성하고 있습니다.어떻게 무한 루프를 대체 할 수 있습니까?

 
      string b; 
... 
      while (b.IndexOf("\n\n") >= 0) 
       b = b.Replace ("\n\n", "\n"); 

단일 대체는 입력에서 처리하지 않으므로 \ n \ n \ n 루프가 필요합니다. 나는 그것이 작동해야한다고 생각하며, 보통 그렇게합니다.

하지만 때로는 무한 루프가되어 버리는 경우가 있습니다. 매 반복마다 \ n 수가 줄어야하므로 결국 종료해야합니다.

아이디어가 있으십니까?

+2

그것을 중지하지 않습니다 당신은 예를 들어 라인을 가지고 있습니까? 적 디버거로 침입 한 적이 있습니까[email protected] \t \t \t \t System.IO.StreamReader aFile 변수 = System.IO.File.OpenText (: –

+0

내 대답은 여기에 무한 –

+0

를 실행하려면이를 강제 한 경우 내가 무한 루프를 일으키는 불쾌한 문자열을 얻을 방법을 보여줍니다 "c : \ xfer \ s.tab"); \t \t \t \t 문자열 b = aFile.ReadToEnd(); \t \t \t \t aFile.Close(); 파일 s.tab이 18 진수 바이트 포함 FF FE 여기 내 프로그램으로부터 출력 0A 00 42 00 41 00 0D 0A 00 0D 0A 00 0D : 의 b.length = 8 루프 N = 1, i = 3, b = A ?? B i = 3, b (i) = 10 2573 3328 ... done n = 1, i = 3, b = A ?? ?? B 따라서 잘못된 유니 코드와 관련이 있습니다. 그러나 나는 아직도 그것이 일어나야한다고 생각하지 않는다. – Rob625

답변

6

이 작업은 다음과 같습니다

String c = Regex.Replace(b, "\n\n+", "\n"); 
+0

왜 추가 \ n? 아래에 게시 한 대답은 \ n +으로 처리해야합니다. –

+0

예, 정상적으로 작동합니다. 효율성을 높이기 위해 여분의 \ n이 필요합니다. 이렇게하면 이중 및 삼중 (및 그 이상) 연속 줄 넘김이 바뀝니다. 그러나 한 줄의 피드 만 남습니다. 또한이 방법을 사용하면 더 이상 루프가 필요하지 않습니다. 이 경우 정규 표현식이 간단합니다. –

+0

Regex가 '\ n'을 NOOP 인 '\ n'으로 대체하여 불필요한 일치를 방지하는 것은시기 상조입니다. – notnoop

0

당신이 무한 루프에 도착하는 문자열의 예를 들어 주실 수 있습니까? 또한 프로그램을 디버그하려면 다음과 같이 바꾸십시오.

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

출력 내용을 확인하십시오.

+0

불행히도 제 예제는 13000 개의 문자열입니다. IndexOf가 연속 반복에서 같은 값을 반환하는지 확인하는 Console.Writes를 추가했습니다. Visual Studio 2003을 사용하면 문자열을 조사하고 인쇄 할 수없는 문자를 보는 방법을 알 수 없습니다. 나는 Writes를 더 추가 할 수 있다고 생각한다. – Rob625

6

설명 할 수없는 무한 루프에 대한 설명이 없습니다 (문자열을 변경했는지 확인 했습니까?). 정규 표현식을 사용하면 더 쉽고 빠릅니다 :

b = System.Text.RegularExpressions.Regex.Replace(b, "\n+", "\n") 
+0

이것이 최선의 방법 인 IMO입니다. –

0

그 밖의 다른 사람이 등장 할 경우를 대비하여이 대답을 여기에 올리면 b가 빈 문자열 인 경우 위에 게시 된 코드가 무한 루프 할 것이라는 점을 알 수 있습니다. 즉 올바르지 않습니다 전달 된 값 매개 변수이 비어있는 경우 IndexOf는 문자열 자체 (이 경우 B)가 비어 있지 않은 경우, 0을 돌려 보낼

String b = String.Empty; 

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

// output: -1 

documentation 상태.

0

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

파일 s.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 

: FF FE 41 00 0D 0A 00 0D 0A 00 0D 0A 여기에 42 00

00 내 프로그램에서 디버그 출력은 그것은 잘못된 유니 코드와 관련이 있습니다. i = 3 = IndexOf ("\ n \ n")에서 시작하는 문자열 b의 문자의 십진수 값을 출력했습니다. 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); 
     } 
관련 문제