Entwickler-Ecke

Basistechnologien - Probleme mit Console.Read(), in Verbindung mit WhileSchleife


Sharpener - Mi 18.04.12 20:44
Titel: Probleme mit Console.Read(), in Verbindung mit WhileSchleife
Hey,
ich arbeite zurzeit an einen Projekt , in dem ich Lösungstools für mathematische Probleme programmiere. Zurzeit bearbeite ich Ableitungen, die alte Methode die ich programmiert habe vor 2 Tagen weist jedoch ein paar Schwächen auf.
Die wollte ich mit einer "live"-Verarbeitung also Textverarbeitungsmäßig lösen, in C kenn ich eine gute Methode dafür, die wollte ich einfach mal potieren:
Resultat:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//Aus der Klasse differenzialklasse .... Testmethode
public void NewAbleiten()
        {
            string testvor;
            string test  ="";
            Console.Write("Die abzuleitende Funktion: ");
            while (true)
            {
                testvor = Convert.ToString(Console.Read());
                if (testvor == " ")
                {
                    break;
                }
                test += testvor;
            }
            Console.WriteLine(test);
        }

Leider will das nicht so richtig funktionieren... Als Abbruch habe ich mal das Leerzeichen festgelegt (eigentlich wollte ich Enter"), aber so richtig will das nicht.
In C hat es soweit funktioniert, aber hier nicht, wo liegt das Problem?


Ralf Jansen - Mi 18.04.12 21:08

Console.Read liefert dir den Wert des eingelesen Zeichen. Also bei einem Leerzeichen z.B. 32. Und ein ToString liefert dir dann natürlich eben diesen Wert als String eben 32 und nicht einen Leerzeichen. Du solltest also nicht ToString verwenden sondern ToChar da ja eh nur ein einzelnes Zeichen eingelesen wird.

So wie es eben auch die Doku [http://msdn.microsoft.com/de-de/library/system.console.read.aspx] erklärt.


Sharpener - Do 19.04.12 16:43


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        public void NewAbleiten()
        {
            string testvor;
            string test  ="";
            Console.Write("Die abzuleitende Funktion: ");
            while (true)
            {
                testvor = Convert.ToString(Convert.ToChar(Console.Read()));
                if (testvor == "")
                {
                    break;
                }
                test += testvor;
            }
            Console.WriteLine(test);
        }

Funktioniert aber immer noch nicht richtig


Ralf Jansen - Do 19.04.12 17:38

Wenn du wolltest das bei jedem Tastendruck ein return an deine Anwendung erfolgt damit du den Tastendruck sofort auswerten kannst wäre Console.ReadKey() zu verwenden. Console.Read() wird auch erst zurückkehren wenn ein Enter im Eingabebuffer ist und dann wird dir Console.Read() den Inhalt des Eingabepuffers zeichenweise liefern bis zum Enter.


Sharpener - Do 19.04.12 21:25

Ich habe Read() nun durch ReadKey() ersetzt und damit verbunden auch die Konvertierung. Als Abbruchzeichen hab ich testweite das p gesetzt. Trotzdem will es nicht funktionieren.
Nur als Vermerk, hier der äquivalent in C (ohne Speicherung der einzelnen Zeichen nachher im String und ausgabe)

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
int main()
{
Char c;
for(;;)
{
ch = getchar();
if ( ch == '~')
{
break;
}
}

Dieser funktioniert... Morgen werde ich nochmal in meinen C# Code gucken


Ralf Jansen - Fr 20.04.12 00:11

äquivalent in C#


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
static void Main()
{
    while (true)
    {
        char c = Console.ReadKey().KeyChar;
        if (c == '~')
            break;
    }
}


besser fände ich allerdings


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
static void Main()
{
    char c;
    do
    {
        c = Console.ReadKey().KeyChar;
    } while (c != '~');
}


Sharpener - Fr 20.04.12 18:24

Jetzt will das Programm funktionieren... Danke!
Diese Funktion:

C#-Quelltext
1:
Console.ReadKey().KeyChar                    

war mir bisjetzt umbekannt. Welche funktion hat das KeyChar am Ende genau?


Ralf Jansen - Fr 20.04.12 18:36

Die ReadKey Methode liefert dir ein ConsoleKeyInfo [http://msdn.microsoft.com/de-de/library/system.consolekeyinfo.aspx] Object mit Information zur gedrückten Taste z.B. auch ob CTRL, SHIFT etc. gerade auch gedrückt waren. KeyChar ist also nur eine Property der ConsoleKeyInfo Klasse und keine spezielle Funktion und liefert dir halt den Char der gedrückten Taste.