Forum: PC-Programmierung ESC und Entertasten abfangen


von gerbej s. (sgerbej)


Lesenswert?

Hallo!

ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm 
schreiben. Um Benutzereingaben entgegenzunehmen wollte ich eigentlich 
mit kbhit() und getch() die Zeichen einzeln einlesen und entsprechend 
reagieren. Allerdings gibt es die conio.h unter Linux nicht.
Hat da jemand eine Lösung?  ich versuche jetzt zwei kleine Programme zu 
schreiben:
das erste solle dem  Benutzer ermöglichen eine wert eins Variables 
zuändern oder sein alte Wert zu behalten wenn er Enter taste drückt:
1
  
2
  char wahl;
3
  int b=10;
4
  cout<<"b="<<b<<endl;
5
  
6
  do{
7
    cout<< "Bitte geben Sie ein:"<<endl;
8
    cout<< "Taste a: ändern"<<endl;
9
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
10
    cin>> wahl;
11
    
12
    switch(wahl){
13
      
14
    case 'a': 
15
      cout<<"Wert für b eingeben:"<<endl; 
16
      cin>>b;
17
      cout<<"neue Wert von b ist "<<b<<endl;
18
      break;
19
      
20
    case'VK_RETURN' :      
21
      b=b;   
22
      cout<<"b="<<b<<endl;
23
      
24
      break;
25
      
26
    default : 
27
      cout<<"falche eingabe"<<endl;
28
    }   
29
  }while((wahl =='a')||(wahl=='VK_RETURN'));
30
  
31
  return 0;
32
}
aber cin kann  die sonder Zeichen nicht einlesen.


mein zweite Programm soll beendet wird wenn die ESC Taste gedrückt wird:
1
do{
2
  cin<<wahl;
3
  switch(wahl){
4
    
5
  case 'a' : 
6
    // anweisung
7
    break;
8
  case 'b':
9
    //anweisung
10
    break;
11
  case 'c':
12
    //Anweisung
13
    break;
14
  default:
15
    break;
16
  }while(wahl !=VK_ESCAPE);
17
  
18
 return 0;
19
}
20
21
hat jamend  für mich eine Idee wie ich meine Programme zum laufen bringen kann.
22
23
Danke schönmal im Voraus
24
25
Gruß
26
27
Seb

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

VK_RETURN und VK_ESCAPE sind virtuelle Tastencodes von Windows.

Nimm stattdessen die zugehörigen ASCII-Codes: \x0d und \x1b.

von gerbej s. (sgerbej)


Lesenswert?

habe es eben probiert aber es hängt bei ausführung wenn ich enter drücke
1
using namespace std;
2
int main( int argc, char *argv[]) {
3
4
  
5
  char wahl;
6
  int b=10;
7
  cout<<"b="<<b<<endl;
8
  
9
  do{
10
    cout<< "Bitte geben Sie ein:"<<endl;
11
    cout<< "Taste a: ändern"<<endl;
12
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
13
    cin>> wahl;
14
    
15
    switch(wahl){
16
      
17
    case 'a': 
18
      cout<<"Wert für b eingeben:"<<endl; 
19
      cin>>b;
20
      cout<<"neue Wert von b ist "<<b<<endl;
21
      break;
22
      
23
    case 'x0d' :      
24
      b=b;   
25
      cout<<"b="<<b<<endl;
26
      
27
      break;
28
      
29
    default : 
30
      cout<<"falche eingabe"<<endl;
31
    }   
32
  }while((wahl =='a')||(wahl== 'x0d' ));
33
  
34
  return 0;
35
}

von Jasch (Gast)


Lesenswert?

gerbej seb schrieb:
> Hallo!
>
> ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm
> schreiben. Um Benutzereingaben entgegenzunehmen wollte ich eigentlich
> mit kbhit() und getch() die Zeichen einzeln einlesen und entsprechend
> reagieren. Allerdings gibt es die conio.h unter Linux nicht.

Wirklich ganz steinalter DOS-Dreck, gibt es latürnich nicht unter 
Linux...

> Hat da jemand eine Lösung?  ich versuche jetzt zwei kleine Programme zu
> schreiben:

Meines Wissens nimmt man für sowas eine Library namens "ncurses", siehe 
deren Doku.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

gerbej seb schrieb:
> case 'x0d' :

Habe ich das so geschrieben?

Nein. Was wohl macht der \, den ich davor gesetzt habe?

von Klaus W. (mfgkw)


Lesenswert?

Schon mal die Forumssuche bemüht?

Wenn ich das mache, komme ich z.B. zu meinem eigenen Beitrag:
Beitrag "Re: [Linux] Eingabepuffer leeren in C"

Darin sind Ersatzfunktionen für _kbhit() und _getch() gelistet.

von gerbej s. (sgerbej)


Lesenswert?

Rufus Τ. Firefly schrieb:
> gerbej seb schrieb:
>> case 'x0d' :
>
> Habe ich das so geschrieben?
>
> Nein. Was wohl macht der \, den ich davor gesetzt habe?

habe auch das versucht aber ich kriege  es nicht
1
 
2
  do{
3
    cout<< "Bitte geben Sie ein:"<<endl;
4
    cout<< "Taste a: ändern"<<endl;
5
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
6
    cin>> wahl;
7
8
   switch(wahl){
9
        
10
    case '\a': 
11
      cout<<"Wert für b eingeben:"<<endl; 
12
      cin>>b;
13
      cout<<"neue Wert von b ist "<<b<<endl;
14
      break;
15
      
16
      case '\x0d': 
17
    //case \x0d:           
18
      b=b;   
19
      cout<<"b="<<b<<endl;
20
      
21
      break;
22
      
23
    default : 
24
      cout<<"falche eingabe"<<endl;
25
    }   
26
  }while((wahl =='a')||(wahl== 'x0d' ));

von DirkB (Gast)


Lesenswert?

Es war aber nicht von '\a' die Rede.
Und das '\x0d' bezieht sich auf alle Vorkommen von '\x0d'.

von gerbej s. (sgerbej)


Lesenswert?

Sorry Dirk!

der reagiert  auf Esc taste  aber bei Enter -taste bleibt es hängen und 
zwar egal wie oft ich enter drüke und ich vermute dass ich mindenstes 
zwei mal enter-taste drücken muss .
1
  char wahl;
2
  int b=10;
3
  cout<<"b="<<b<<endl;
4
  
5
  do{
6
    cout<< "Bitte geben Sie ein:"<<endl;
7
    cout<< "Taste Esc : ändern"<<endl;
8
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
9
    cin>> wahl;
10
11
   switch(wahl){
12
        
13
    case '\x01b': 
14
      cout<<"Wert für b eingeben:"<<endl; 
15
      cin>>b;
16
      cout<<"neue Wert von b ist "<<b<<endl;
17
      break;
18
      
19
      case '\x0d':           
20
      b=b;   
21
      cout<<"b="<<b<<endl;
22
      
23
      break;
24
      
25
    default : 
26
      cout<<"falche eingabe"<<endl;
27
    }   
28
  }while((wahl =='\x01b')||(wahl== '\x0d' ));
29
  
30
  return 0;
31
}

von DirkB (Gast)


Lesenswert?

Was heißt denn "bleibt es hängen" ?
Was erwartest du denn?

Nimm statt '\x0d' mal '\n'

'\x0d' ist CR = '\r'
'\x0a' ist LF = '\n'

von Andreas B. (andreas_b77)


Lesenswert?

Also mal langsam, so ein Terminal hat nun auch mal Modi und 
Einstellungen, die man ändern kann. Wenn man einzelne Zeichen statt 
ganze Zeilen als Eingabe erhalten will sollte man schon mal den 
Canonical Mode abschalten. Wenn man die automatische Ausgabe und 
sonstige automatische Verarbeitung von Eingabezeichen verhindern will, 
wäre der Raw Mode angebracht.

man termios, da steht das alles. Oder wie oben vorgeschlagen eine 
Library wie ncurses verwenden.

Und beim Rumbasteln passiert es garantiert, dass man die 
Terminaleinstellung mal nicht korrekt wiederherstellt beim Programmende, 
da ist das Kommando "reset" dein Freund. Notfalls blind eingetippt 
versetzt es das Terminal wieder in den Standardzustand.



Und noch was:

gerbej seb schrieb:
> ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm
> schreiben.

Sarge? Das ist ja schon ne olle Kamelle, Debian ist aktuell drei 
Releases weiter. Sicherheitsaktualisierungen gibt es für sarge seit über 
3 Jahren nicht mehr.

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.