Laden...

Problem mit while schleife und switch-Anweisung

Erstellt von deerhunter vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.414 Views
D
deerhunter Themenstarter:in
91 Beiträge seit 2005
vor 18 Jahren
Problem mit while schleife und switch-Anweisung

Hallo,

ich bin neu hier im Forum und würde mich freuen, wenn ihr eine Lösung zu meinem Problem anbieten könntet.

Ich habe ein kleines "Menü" für meine Konsolenanwendung geschrieben und rufe mit der Eingabe von Zahlen mit Hilfe der switch-Anweisung den gewünschten Code auf.

Alles funktioniert prima, d.h. wenn ich 1, 3 oder 4 aufrufe, führt er den Code aus und ich gelange anschließend wieder zur Menüauswahl.
Wenn ich jedoch die 2 aufrufe, führt er den Code von "Case 2" aus und beendet das Programm ohne zum Auswahlmenü zurückzukehren.

Beim Step-by-Step debuggen habe ich festgestellt, dass er einfach die Console.ReadLine() Anweisung aus Zeile 19 überspringt, d.h. ich kann im Konsolenfenster nichts eingeben.
Das ganze verwundert mich sehr, da ich das "Menü" schon mehrfach verwendet habe und es bisher nie Probleme gab.
Hat jemand von euch vielleicht eine Idee, wo der Fehler liegen könnte?

Vielen Dank im Voraus.
Florian

P.S.: Ich habe im Code öfters ein "\n" bei der Stringausgabe verwendet. In dem Forum-Code wird dieses aber nicht dargestellt - zumindest in der Vorschau...
Sollte aber kein Problem sein, da es mir nur um die switch-case-Anweisung im Fall "case 2" geht.

[edit]
Ich benutze Visual STudio 2005 und .NET 2.0 unter Windows XP
[/edit]


using System;
using System.Collections;
using System.Text.RegularExpressions;

namespace Stringformatierung
{
	class Class1
	{
		[STAThread]
		static void Main(string[] args)
		{
			int Auswahl = 1;
			string Standardtext = "Ein einäugiger Bandit reinigt einige dreckige Kleidungsstückstreifen mit ein wenig Seifenlauge, die er eigens für eine solche Aktion vorbereitet hat.";
            string temp=null;
            while (Auswahl!=0)
			{
				Console.WriteLine("\n\n(0) beenden\n(1) Umwandlung einzelner Buchstaben eines Strings ('e'-->'D') und ('t'-->'U')\n(2) Anzahl der Zeichen im String zählen\n(3) EMail-Adresse überprüfen\n(4) Dateinamen aus vollständiger Pfadangabe extrahieren");
                Console.Write("Auswahl: ");
                temp = Console.ReadLine();  // <-- diese Zeile wird einfach übersprungen

                switch (Auswahl = temp != "" ? Convert.ToInt32(temp) : 0)  //Kurzform für if (temp !="") Auswahl = Convert.ToInt32(temp) else 0
				{
					case 1:
                        Console.Write("\nEingabe des Strings [leer lassen für Standardtext]: ");
						string Text = Console.ReadLine();
                        if (Text == "")
                            Text = Standardtext;
						string Text_1 = Text.Replace('e','D').Replace('t','U');
						Console.WriteLine("\nalter Text:\n{0}", Text);
						Console.WriteLine("\nveränderter Text:\n lautet{0}",Text_1);
                        break;

					case 2: 
						Console.WriteLine("Eingabe des Strings [leer lassen für Beispieltext]: ");
						string Eingabe_2 = Console.ReadLine();
						if (Eingabe_2 == "")
							Eingabe_2 = Standardtext;
						Console.Write("\nEingabe eines Such-Buchstabens: ");
                        char Such_Buchstabe = Convert.ToChar(Console.Read());
                        char[] array = Eingabe_2.ToCharArray();
                        int Anzahl = 0;
                        foreach (char i in array)
                            if (i == Such_Buchstabe)
                                Anzahl++;
                        Console.WriteLine("\n{0}\n", Eingabe_2);
                        Console.WriteLine("Der Buchstabe \"{0}\" kommt {1}x vor. ", Such_Buchstabe, Anzahl);
						break;

                    case 3:
                        Console.Write("Bitte eine EMail-Adresse eingeben: ");
                        string email = Console.ReadLine();
                        if (Regex.IsMatch(email, @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$"))
                            Console.WriteLine("Adresse ist gültig.");
                        else
                            Console.WriteLine("Adresse ist ungültig.");
                        break;

                    case 4:
                        Console.Write("Bitte einen Pfad angeben [frei lassen für Beispielpfad]: ");
                        string Pfad = Console.ReadLine();
                        if (Pfad == "")
                            Pfad = @"C:\test\meinetextdatei.doc";
                        string pattern = @".*\\(?<Dateiname>\w+)\.(?<Endung>\w+)";
                        string replacement = @"${Dateiname}";
                        string dateiname = Regex.Replace(Pfad, pattern, replacement);
                        Console.WriteLine("kompletter Pfad: {0}\nDateiname: {1}",Pfad, dateiname);
                        break;

					default:
						break;
				}
			}
		}
	}
}

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo deerhunter,

das Problem ist, dass du in case 2 Console.Read benutzt. Und damit nur einzelne Zeichen aus der Eingabe liest. Die verbleibenden Zeichen (z.B. der Zeilenvorschub) werden dann von ReadLine gelesen weshalb die Zeile "übersprungen" wird. Benutze überall ReadLine. Dann geht es.

herbivore

D
deerhunter Themenstarter:in
91 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Hallo deerhunter,

das Problem ist, dass du in case 2 Console.Read benutzt.

herbivore

Hallo herbivore,
Vielen Dank für deine Hilfe, jetzt funktioniert es! Da wäre ich im Leben nicht drauf gekommen...

Gruß, Florian

308 Beiträge seit 2005
vor 18 Jahren

Hallo deerhunter,

herbivore hat recht.

versuch es so:

....


Console.Write("\\nEingabe eines Such-Buchstabens: ");
string such_BuchstabeEingabe = Console.ReadLine();
if (such_BuchstabeEingabe.Length == 0)
  break;
char Such_Buchstabe = such_BuchstabeEingabe[0];
char[] array = Eingabe_2.ToCharArray();

...