Question

Je travaille sur un code C # plutôt inefficace qui veut supprimer les lignes de blancs. Il fait ceci:

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

Une seule remplacer ne pas faire face à (par exemple) \ n \ n \ n dans l'entrée, de sorte que la boucle est nécessaire. Je pense qu'il devrait fonctionner, et il le fait habituellement.

Mais parfois, il parvient à entrer dans une boucle infinie, et je ne comprends pas comment. A chaque itération le nombre de \ n devrait réduire, il faut mettre fin à la suite.

Toutes les idées?

Était-ce utile?

La solution

Est-ce que ce travail:

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

Autres conseils

Je n'ai pas d'explication pour votre boucle infinie inexplicable (êtes-vous certain que c'est infini Avez-vous vérifié pour voir si les changements de chaîne?), Mais vous pouvez le faire beaucoup plus facile et plus rapide avec une expression régulière:

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

Pouvez-vous donner un exemple d'une chaîne pour laquelle cette pénètre dans une boucle infinie? Aussi pour déboguer votre programme, vous pouvez essayer de le remplacer par:

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

et voir ce qu'il génère.

Je vais juste mettre cette réponse ici pour clarifier un point au cas où quelqu'un d'autre arrive et suggère que le code affiché ci-dessus en boucle à l'infini si b est une chaîne vide. Cela est inexact:

String b = String.Empty;

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

// output: -1

La documentation indique que IndexOf retourne 0 si la valeur paramètre est passé à elle est vide, pas si la chaîne elle-même (b dans ce cas) est vide.

J'ai épinglé le problème à une chaîne méchante que je reçois par la lecture d'un fichier (code complet ci-dessous).

s.tab du fichier contenant ces 18 octets hex FF: FE 41 00 0D 0D 0A 0A 00 00 0D 0A 00 42 00

Voici la sortie de débogage de mon programme:

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 

Il est donc quelque chose à voir avec unicode non valide. J'imprimé les valeurs décimales des caractères de la chaîne B, à partir de i = 3 = IndexOf ( "\ n \ n"). IndexOf semble voir le 10 comme un saut de ligne (OK), puis 2573 (qui est 0D 0A) comme un autre (non OK?). Remplacez ensuite ne sont pas d'accord.

Il est clair qu'il ya quelque chose de mal avec les données contenues dans le fichier. Mais je ne pense pas encore cela devrait se produire. IndexOf et remplacer doivent se mettre d'accord.

Je suis la solution de mise en œuvre de msaeed. Merci beaucoup.

Code de débogage:

        {
            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);
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top