getch() in einen string umwandeln

root1992

root1992

von IT-Lehrern besessen
Hallo

ich habe ein Problem in C. Manpages und Bücher habe ich schon gelesen. RTFW (Seekport) auch, komm aber nicht weiter.

#include <stdio.h>
#include <ncurses.h>

#define ENTER 10
#define MAX 30
int x=30;
int w;
int main()
{
initscr();
keypad(stdscr,TRUE);
noecho();
w=3;
while ( (getch() != ENTER) && (x < MAX) )
{

ch=getchar();
puffer1[x++] = ch;
p[0] = ch;
mvprintw(2,w++,"%s",p);
refresh();
}
refresh();
endwin();
return 0;
}


So sieht ein Teil aus. Mein Problem: So würde es funktionieren, aber ich muss jedesmal das Zeichen, das ich eingeben will zwei mal drücken (getch(), getchar()).
Kann ich irgendwie die Eingabe von getch() in einen String umwandeln. Aber bitte nicht die Möchlichkeit:

if (getchar==65)
ch="A"



Danke
 
hmm... da war wohl wer schneller als ich :oldman
...ändert aber nix dran dasser recht hat
wer zwei mal ne eingabe abfragt muß auch zwei mal eingeben :D
 
Aber nach meinen Infos gibt getch() eine Zahl aus, ich brauche aber Buchstaben, Zahlen, ... .
Ansonsten muss ich es ja so schreiben: if (ch==65){printf("A");}

Ich erkläre mal die Funktion:

Ich habe eine Eingabezeile. Wenn ich Enter drücke soll er in die nächste While-Schleife gehen, bzw. eine andere Funktion ausführen. Wenn ich z.B. <STRG+F> drücke, sollte er "\textbf{" zum String hinzufügen. Wenn ich <A> drücke, soll er "A" zum String hinzufügen. Wenn er MAX erreicht soll er automatisch die Schleife beenden.

Es soll ein ncuses Programm werden mit dem man mithilfe von LaTeX Endlosaufkleber erstellen kann.
 
Erstmal ein paar Korrekturen des von dir geposteten Source: :)
Code:
#include <stdio.h>
#include <ncurses.h>

WINDOW *win; // <- damit wir wissen auf welchem Screen wir arbeiten

#define ENTER 10
#define MAX 30
int x=30;
int w;
int main()
{
  win = initscr(); // <- damit stellen wir sicher, dass wir immer mit unserem win arbeiten
  keypad(win, true);
  cbreak; // <- du liest doch eh nur einzelne Zeichen ein
  noecho();
  w=3;
  /* so wie du das folgende gemacht hast, wird das nichts, mehr dazu gleich */
  while ( (getch() != ENTER) && (x < MAX) ) {
    ch=getchar();
    puffer1[x++] = ch; 
    p[0] = ch;
    mvprintw(2,w++,"%s",p);
    refresh();
  }
  refresh();
  endwin();
  return 0;
}
Richtig, getch gibt int zurueck. Willst du ueberpruefen, ob eine bestimmte Taste gedrueckt wurde, solltest du mit ncurses wgetch() nutzen:
Code:
int ch;
if((ch = wgetch(win)) != ERR) {
  switch(ch) {
    case 'A':
      // dein code hier
    case 'B':
      // dein code hier
  }
}
nutzen.
 
Zuletzt bearbeitet:
Ich wollte eigentlich vermeiden, dass ich für jeden Buchstaben, etc eine if/case Anweisung brauche.
Aber wie ich es so sehen, führt nix dran vorbei.
 
Wenn du mit wgetch() arbeiten willst, und Aktionen auf bestimmte Tastendruecke folgend ausfuehren willst, duerfte dies wohl der eleganteste Weg sein.

Nachtrag: Kannst ja auch das einlesen der Keys in eine extra Funktion auslagern, so dass du
Code:
ch = wgetch(win);
parse_key(ch); // in diese Funktion packst du das ganze Auswerten der Keys
nutzen kannst.
 
Zuletzt bearbeitet:
root1992 schrieb:
Ich wollte eigentlich vermeiden, dass ich für jeden Buchstaben, etc eine if/case Anweisung brauche.
Aber wie ich es so sehen, führt nix dran vorbei.
Brauchst du auch nicht. 'a' entspricht bei mir der Zahl 97. Wenn du bei getch() jetzt 'a' eingibst, gibt die Funktion nen int(97); zurück.
Das wiederrum kannst du implizit in ein char casten, wodurch du dein gewünschtes Zeichen hast:

Code:
int main(int argc, char **argv) {
	char c;
	int i;
	
	i = getch();
	c = i;
// oder gleich c = getch();
}
 
Was nichts daran aendert, dass auch diese Characters nachher noch ausgewertet muessen um aufgrund bestimmter Tastendruecke bestimmte Aktionen auszufuehren, womit er dann doch wieder besagtes switch-case braucht. Abgesehen davon tut der von mir beschriebene Code ja nichts anderes, als das, was ich bereits beschrieben hatte, nur dass du kein Error-Checking nutzt, was ich nicht unbedingt als guenstig einschaetzen wuerde.

Mein Code:
Code:
...
if((ch = wgetch(win)) != ERR) {
...

Dein Code:
Code:
c = getch();
Wir sehen... Der einzige Unterschied liegt in der Verwendung eines expliziten Window und in der Fehler-Ueberpruefung. :)

Um die Auswertung des Wertes von ch (oder in deinem Fall 'c') kommt er also trotzdem nicht herum und die ist nunmal am einfachsten mit einem Switch-Case zu realisieren.
 
Zuletzt bearbeitet:

Ähnliche Themen

Aufgabe in C

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

NagiosGrapher 1.7.1 funktioniert nicht

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Dezimal in Binär in C - brauche Hilfe

Zurück
Oben