Forum: PC-Programmierung _getch() Problem cpp


von Herbert P. (Gast)


Lesenswert?

ich steh grad auf dem Schlauch. sieht jemand warum folgender Code nicht 
funktioniert? Es wird beim Drücken von "1" zwar 1 ausgegeben, aber die 
Schleife wird nicht verlassen
1
while (key!=1) {
2
  int key = _getch();
3
  key = key - 48;
4
  cout << key;
5
}
6
cout << endl << "Key 1 detected" << endl;

von Lutz (Gast)


Lesenswert?

Weil die variable key innerhalb der while Schleife deklariert wird.

Wahrscheinlich ist das nicht der ganze Code und die variable wird 
außerhalb auch deklariert. Diese variable wird für die Überprüfung bei 
while(...) Genutzt.

von Zombie (Gast)


Lesenswert?

Du hast (vermutlich) zwei unterschiedliche/unabängige Variablen mit dem 
selben Namen "key", ansonsten würde dein Beispiel gar nicht kompilieren.
1
int key = 0;
2
while (key!=1) {
3
  key = _getch();
4
  key = key - 48;
5
  cout << key;
6
}
7
cout << endl << "Key 1 detected" << endl;

von Herbert P. (Gast)


Lesenswert?

Zombie schrieb:
> int key = 0;
> while (key!=1) {
>   key = _getch();
>   key = key - 48;
>   cout << key;
> }
> cout << endl << "Key 1 detected" << endl;

ich hatte es anfangs genau so, hier werden aber merkwürdigerweise 
Buchstaben als Buchstaben wiedergegeben anstatt deren ASCII Wert...
Wie auch immer, auch so funktionierte die Erkennung der 1 nicht.

von M.K. B. (mkbit)


Lesenswert?

Was gibt denn das Programm im letzten Post genau aus?

von Herbert P. (Gast)


Lesenswert?

M.K. B. schrieb:
> Was gibt denn das Programm im letzten Post genau aus?

Eingabe:
qwert12345qwert

Ausgabe (Leerzeichen zur besseren Übersicht):
65 71 53 66 68 1 2 3 4 5 q w e r t

von zitter_ned_aso (Gast)


Lesenswert?

warum nicht einfach:
1
cin>>key;

von Herbert P. (Gast)


Lesenswert?

zitter_ned_aso schrieb:
> warum nicht einfach:cin>>key;

weil ich einen einzelnen keystroke registrieren möchte und keine Eingabe 
die mit Enter terminiert werden muss.

von M.K. B. (mkbit)


Lesenswert?

cout gibt Zahlen als lesbare Zahlen aus. Nur bei char Datentyp (je nach 
System ist auch ein int8 ein char) werden diese als Buchstaben 
interpretiert.

Bei mir sieht die Ausgabe am Anfang auch so aus, aber die 1 wird richtig 
erkannt.

Welchen Compiler verwendest du denn. Bei mir ist _getch nicht verfügbar.

von Herbert P. (Gast)


Lesenswert?

M.K. B. schrieb:
> Welchen Compiler verwendest du denn. Bei mir ist _getch nicht verfügbar.

Viusal Studio 2019
#include <conio.h>

von DPA (Gast)


Lesenswert?

M.K. B. schrieb:
> Bei mir ist _getch nicht verfügbar.

Das ist teil von Microsofts Inkompatibilitätsprogramm. Das C standard 
equivalent ist getchar() und fgetc(stdin). Aber in C++ nimmt man ja 
normalerweise sowieso std::cin.

von Zombie (Gast)


Lesenswert?

Herbert P. schrieb:
> Eingabe:
> qwert12345qwert
>
> Ausgabe (Leerzeichen zur besseren Übersicht):
> 65 71 53 66 68 1 2 3 4 5 q w e r t

Sorry, aber das kann doch nicht sein. Die ersten zehn Eingaben werden 
richtig verarbeitet, und die nächsten fünf nicht mehr?!

Zeig mal den ganzen Code.

von DPA (Gast)


Lesenswert?

So nebenbei 1 != '1'.

von M.K. B. (mkbit)


Lesenswert?

DPA schrieb:
> So nebenbei 1 != '1'.

Ja, aber nachdem ja erst 48 abgezogen werden, passt es.

von Zombie (Gast)


Lesenswert?

DPA schrieb:
> So nebenbei 1 != '1'.

deswegen schreibt er ja auch
1
key = key - 48;

wobei ich eher
1
key = key - '0';

schreiben würde.

von zitter_ned_aso (Gast)


Lesenswert?

und davor noch
1
if(isdigit(key))
2
...

Aber das wird immer mehr C statt C++.

von Herbert P. (Gast)


Lesenswert?

Zombie schrieb:
> Zeig mal den ganzen Code.


Danke für den Tipp! Ich wollte den Code nun abgrenzen (der gesamte COde 
ist zeimlich lang). Dabei bin ich auf folgendes gestoßen:

Unmittelbar nach der while Schleife hatte ich:
  cin >> n;

mit dem ich zuvor mal getstet hatte. Steht das dort, wird die SChleife 
nicht verlassen. Sehe zwar den Grund dafür nicht, aber zumindest konnte 
ich die Fehlerquelle eleminieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.