2017-03-17 5 views
-1

Ich mache einen Brief Zähler in C#, es kompiliert ok, aber jedes Mal, wenn ich es ausführen, habe ich diesen Fehler "System.IndexOutOfRangeException" on line "if (chars [num] == knizka [num1]) ". Was soll ich bitte tun? IDK, warum ich mehr Text

  int num = 0; 
      int num1 = 0; 
      string knihaRef = System.IO.File.ReadAllText("Osnova.txt"); 
      knihaRef = knihaRef.ToLower(); 
      string abcd ="abcdefghijklmnopqrstuvwxyz"; 
      abcd = abcd.ToLower(); 
      char[] chars =abcd.ToArray(); 
      char[] knizka = knihaRef.ToArray(); 
      int[] numOfLet =new int[26]; 

      for (int i=0; i<chars.Length;i++) 
      { 
       numOfLet[i] = 0; 
      } 

      while(num1<knizka.Length) 
      { 
       if (chars[num]==knizka[num1]) 
       { 
        numOfLet[num]++; 
        num1++; 
        num++; 

        if (num>=numOfLet.Length) 
        { 
         num = 0; 
        } 
       } 
       else 
       { 
        num++; 
       } 
      } 
+0

[Dies wird dazu beitragen] (http://stackoverflow.com/questions/20940979/what-is-an-indexoutofrangeexception-argumentoutofrangeexception-and-how-do-if) – Dec

+0

Mögliche Duplikat [Was für ein ist IndexOutOfRangeException/ArgumentOutOfRangeException und wie behebe ich es?] (Http://stackoverflow.com/questions/20940979/what-is-andexoutofrangeexception-argumentoutofrangeexception-and-how-do-if) – Kyle

+0

Die 'else' Anweisungen sehen so aus Es ist die Ursache für dein Problem. Es kann dazu führen, dass 'num' auf einen Wert größer als' chars.Length' ansteigt. – Sean

Antwort

0

Zuerst benutzen string.ToCharArray() statt string.ToArray() hinzufügen müssen - es macht es klarer für die Zukunft.

Verwenden Sie ein Debugging-Tool, um den Wert knihaRef zu finden, um zu sehen, ob ihm ein Wert zugewiesen ist.
Gehen Sie auch durch Ihre while Schleife und die verschachtelte for Schleife, um zu überprüfen, dass Sie nicht aus den Grenzen des Arrays gehen.

0

Wie Juharr in den Kommentaren notiert, überprüfen Sie nicht, ob num auf die Größe von chars.Length wächst. Dies kann passieren, wenn sich ein Charakter in einem Knizka befindet, der nicht in Chars ist. z.B. Wenn in knizka ein Interpunktionszeichen vorhanden ist, wird nichts in chars übereinstimmen und die while-Schleife wird vom Ende der Zeichen ausgehen, die nach einem Spiel suchen.

0

Das Hauptproblem ist, dass in Ihrem else Sie erhöhen num, aber dann nicht sicherstellen, dass es nicht außerhalb des Bereichs von chars ist, die, wenn Sie irgendwelche Zeichen passieren kann, die nicht Standard-englische Buchstaben sind. Wenn Sie es auf Null setzen und num1 inkrementieren möchten, da Sie bereits knizka[num1] gegen alle Kleinbuchstaben getestet haben.

while(num1<knizka.Length) 
{ 
    if (chars[num]==knizka[num1]) 
    { 
     numOfLet[num]++; 
     num1++; 
     num++; 

     if (num>=numOfLet.Length) 
     { 
      num = 0; 
     } 
    } 
    else 
    { 
     num++; 

     if (num>=numOfLet.Length) 
     { 
      num = 0; 
      num1++; 
     } 
    } 
} 

Obwohl es einfacher, wenn Sie nur die Zeichen in knihaRef Prüfung durchlaufen, wenn das Zeichen ein Kleinbuchstabe ist, und wenn es dann können Sie den Index, indem den ASCII-Wert von 'a' davon zu erhöhen, erhalten. Außerdem müssen Sie die Schleife nicht ausführen, in der Sie alle Werte in numOfLet auf Null setzen, da das Array beim Erstellen nur mit Nullen initialisiert wird.

string knihaRef = System.IO.File.ReadAllText("Osnova.txt").ToLower(); 
int[] numOfLet =new int[26]; 

foreach(char c in knizka) 
{ 
    // Only count letters. 
    if ('a' < c && c < 'z') 
    { 
     numOfLet[c-'a']++; 
    } 
}