2017-10-25 17 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public const int N = 10; 
     static void Main(string[] args) 
     { 
      char[] word = Console.ReadLine().ToCharArray(); 
      int i = 0, j = 0; 
      Console.WriteLine(word); 
      while ((word[i] >= 'a' && word[i] <= 'z') || (word[i] >= 'A' && word[i] <= 'Z')) 
      { 
       j++; 
       i++; 
      } 
      Console.WriteLine(+j); 
      Console.ReadLine(); 

     } 
    } 
} 

Jedes Mal, wenn ich versuche zu debuggen, sagt mir der Debbager "IndexOutOfRangeException wurde nicht behandelt" und ich weiß nicht, warum.Was ist falsch mit dieser Bedingung?

+1

Sie nie die Länge des 'word' überprüfen Array. Wenn alle Zeichen Buchstaben sind, wird die Schleife fortgesetzt, bis "i" über dem Ende des Arrays liegt und Sie erhalten die Ausnahme. –

+0

Tipp: Bevor Sie Fragen stellen, stellen Sie sicher, dass Sie nach Fehlernachrichten/Ausnahmebedingungen suchen (wie https://www.bing.com/search?q=c%23+IndexOutOfRangeException). Wenn Sie sich dennoch entscheiden, eine Frage zu stellen, folgen Sie [MCVE]. Richtlinien, um minimalen Code mit allen notwendigen Informationen inline (dh in diesem Fall '" A ".ToCharArray() [1]' ") –

Antwort

3

Du bist gerade nicht nur für die Länge der Anordnung und Überprüfung kontinuierlich für Elemente, die die IndexOutOfRangeException

diese Bedingung verursachen hinzufügen und es wird

while (i < word.Length && (word[i] >= 'a' && word[i] <= 'z') || (word[i] >= 'A' && word[i] <= 'Z')) 
{ 
    j++; 
    i++; 
} 

Sie arbeiten sollten auch wissen, warum IndexOutOfRangeException geworfen und was es bedeutet - https://msdn.microsoft.com/en-us/library/system.indexoutofrangeexception(v=vs.110).aspx

2

Dies ist, weil Sie i und j bei jeder Wiederholung der While-Schleife inkrementieren, aber Sie nie Verlasse die Schleife.

char[] word = Console.ReadLine().ToCharArray(); 

Was passiert, wenn i einen Wert, der größer ist als die in der Konsole Leseleitung wird? Sie erhalten die IndexOutOfRangeException

Vielleicht denken Sie daran, wenn Sie aufhören möchten, inkrementieren i, und brechen Sie aus der Schleife.

+1

..die Frage riecht nach Hausaufgaben .. Ich habe entsprechend geantwortet und nur nicht zur Verfügung gestellt Die Lösung, aber eher das Poster denken darüber nach, wie zu lösen ist – flyte

2

Die obigen Antworten lieferten bereits ausreichende Informationen über das Problem. Ich schätze, ich werde nur das Ergebnis hinzufügen.

Wenn Sie nur die Alphabete anzeigen möchten, überprüfen Sie einfach, ob die eingegebenen Buchstaben/Wörter alphabetische Zeichen oder Leerzeichen sind, dann zeigen Sie die Buchstaben/Wörter an, andernfalls geben Sie die ungültige Fehlermeldung zurück.

Hier ist die vollständig getestete Klasse für Ihre Referenz.

using System; 
using System.Text.RegularExpressions; 

namespace WhileLoop 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      string words = Console.ReadLine(); 

      //input words 
      Console.WriteLine(words); 


      //check not alphabet or space, return invalid error message 
      Regex rgx = new Regex("[^a-zA-Z ]+"); 
      if (rgx.IsMatch(words)) 
      { 
       Console.WriteLine("Please input alphabet or space only Ie. A-Z, a-z,"); 
      } 

      Console.ReadLine(); 

     } 
    } 
} 

Szenario # 1 - Input non-Alphabet Zeichen enter image description here

Szenario 2 - Eingang Alphabet Zeichen und Raum (erwartetes Ergebnis) enter image description here

+0

Der OPs-Code zählte die Anzahl der führenden alphabetischen Zeichen in einer Zeichenfolge, aber das ist auch interessant. –