Umschalten?
-
Da kommt dann so ein kleiner Linkspfeil. Ich hab jetzt schon mal in meiner ASCII-Liste nachgeschaut und hab genau diesen Pfeil gar nicht gefunden... Wie soll ich den dann über die Tastatur eingeben können?
EDIT: Ah, sorry! Es kommt zweimal ESC gefunden..Wie aber soll ich denn jetzt diesen kleinen Pfeil über die Tastatur eingeben können?
-
Wenn ich das jetzt wieder mit der Eingabe mache, dann passiert jetzt was komisches nämlich, der Compiler überspringt mir einfach die Funktion decode...
#include<stdio.h> #include<string.h> char* string_eingeben(char *string) { char zeichen; zeichen = getchar(); while(zeichen != '\n') { *string = zeichen; zeichen = getchar(); ++string; } *string = '\0'; return string; } char* decode(char *string) { while(*string != '\0') { if(*string == 27) { printf("ESC gefunden \n"); } string = string + 1; } return string; } int main() { char string[100]; string_eingeben(string); decode(string); return 0; }
-
So wie ich das sehe gibst du in der Funktion den String per return zurück, ignorierst aber in der main() den Rückgabewert.
Chris_
-
So ich hab hier jetzt nochmal weitergemacht. Jetzt hab ich meinen Code soweit, dass er mir was ausspuckt und das was er ausspuckt ist auch FAST die Zeichenkette die ich ihm reingegeben habe:
#include<stdio.h> #include<string.h> #include<ctype.h> char* string_eingeben(char *string) { /*char zeichen; zeichen = getchar(); while(zeichen != '\n') { *string = zeichen; zeichen = getchar(); ++string; } *string = '\0';*/ return string; } char* decode(char *string) { int i = 0, offset = 0; char zeichen; while(*string != '\0') { if(*string == 27) { offset = i; ++string; ++string; if(*string == '0') { ++string; while(isdigit(*string) != 0) { zeichen = *string; printf("%c", zeichen); ++string; } } else if(*string == '1') { while(isdigit(*string) != 0) { zeichen = *string + 32; printf("%c", zeichen); ++string; } } else if(*string == '2') { while(isdigit(*string) != 0) { zeichen = *string + 64; printf("%c", zeichen); ++string; } } } } return string; } int main() { char string[] = "\x1B(0123\x1B(1123\x1B(2123"; string_eingeben(string); printf("%s", decode(string)); return 0; }
Ausgeben tut das Programm folgendes: 123QQRSrqrs. Ihr seht das stimmt noch nicht ganz...
-
So, jetzt funktioniert das ganze schon mal mit dem fest vorgegebenen String:
#include<stdio.h> #include<string.h> #include<ctype.h> char* string_eingeben(char *string) { /*char zeichen; zeichen = getchar(); while(zeichen != '\n') { *string = zeichen; zeichen = getchar(); ++string; } *string = '\0';*/ return string; } char* decode(char *string) { int i = 0, offset = 0; char zeichen; while(*string != '\0') { if(*string == 27) { offset = i; string = string + 1; string = string + 1; if(*string == '0') { string = string + 1; while(isdigit(*string) != 0) { zeichen = *string; printf("%c", zeichen); string = string + 1; } } else if(*string == '1') { string = string + 1; while(isdigit(*string) != 0) { zeichen = *string + 32; printf("%c", zeichen); string = string + 1; } } else if(*string == '2') { string = string + 1; while(isdigit(*string) != 0) { zeichen = *string + 64; printf("%c", zeichen); string = string + 1; } } } } return string; } int main() { char string[] = "\x1B(0123\x1B(1123\x1B(2123"; string_eingeben(string); printf("%s", decode(string)); return 0; }
-
Warum gibt es einen Unterschied, wenn ich die Zeichenfolge über meine Eingabefunktion eingebe? Wenn ich die Zeichenkette über die Eingabefunktion eingebe, dann bekomme ich in der Funktion decode() bei der Prüfung ob ein ESC vorhanden ist eine Endlosschleife. Wenn ich aber exakt das Gleiche über einen fest vorgegebenen String in die Funktion decode() schicke macht er mir die Funktion decode() schon durch und gibt mir auch brav 123QRSqrs aus...
-
Ka wie sieht die Funktion aus?, aber der Verdacht, dass das Terminierungszeichen fehlt liegt nahe.
-
1. Ich nehme an, dass die Esc-Taste nicht richtig erfasst wird.
Was gibst du überhaupt ein?2. Ist dein decode grundlegend falsch
- Was passiert wenn kein ESC in dem String ist?
- Es sollen alle Zeichen (nicht nur Zahlen) behandelt werden
- Was ist mit ESC ohne folgende ( ?Mach dich mal zum Thema ASCII schlau.
-
1. Ich nehme an, dass die Esc-Taste nicht richtig erfasst wird.
Was gibst du überhaupt ein?Wenn ich das Konsolenfenster da hab (geöffnet durch meine eigene Eingabefunktion), dann drück ich die ESC-Taste danach schreib ich eine '(' und dann noch die jeweilige Ziffer welche mir ja entscheidet was getan werden soll. Wenn ich mir im nachhinein im Debugger den String ansehe, dann ist an der Stelle an der ich eigentlich die ESC-Taste gedrückt habe nix passiert. Danach habe ich versucht, die ESC-Taste zu simulieren in dem ich eben '\x1B' und danach die '(' und danach wieder um die entscheidende Ziffer.
Was hier bzw. nach der Eingabe mit der ESC-Taste passiert ist dann das was ich weiter schon mal beschrieben habe. Es wird die eigentlich danach kommende Funktion "decode" übersprungen und der Debugger geht gleich zum return 0; weiter. Und da weiß ich ja schon nicht was das soll. Besser gesagt die Funktion "decode" wird bei meiner eigenen Eingabefunktion grundsätzlich übersprungen!
- Was passiert wenn kein ESC in dem String ist?
Soll er mir dann eine Fehlermeldung ausgeben?
- Es sollen alle Zeichen (nicht nur Zahlen) behandelt werden
Für mich liest sich das aber anders... Ich will ja ungerne widersprechen!
- Was ist mit ESC ohne folgende (
Soll hier dann auch wieder eine Fehlermeldung ausgegeben werden?
-
- Was passiert wenn kein ESC in dem String ist?
Soll er mir dann eine Fehlermeldung ausgeben?
Na am besten soll sie die Zeichen einfach so übertragen, ohne Wandlung.
Aber was macht sie denn gerade? Eine Endlosschleife weil *if(string == 27) nicht zutrifft und dann nichts gemacht wird.- Es sollen alle Zeichen (nicht nur Zahlen) behandelt werden
Für mich liest sich das aber anders... Ich will ja ungerne widersprechen
Aus der Aufgabe aus deinem ersten Post:
Die Bedeutung des Codes im Bereich 32 bis 63 soll zwischen drei Zuständen umschaltbar sein
Ziffern sind aber nur zwischen 48 und 57!
- Was ist mit ESC ohne folgende (
Soll hier dann auch wieder eine Fehlermeldung ausgegeben werden?
Wie wäre es mit einfach übernehmen? Das ESC kommt in den String und gut ist.
Dein decode kann genau den Teststring machen. Wenn der ein bischen modifiziert wird klappt es schon nicht mehr.
" \x1B(0123\x1B(1123\x1B(2123" Kein ESC im ersten Zeichen vorhanden
"\x1B(0123 \x1B(1123\x1B(2123" Nach ersten den Zahlen ist wierder kein ESCDas Leerzeichen hat übrigens den ASCII-Wert 32.