Veröffentlicht 10. November 200519 j Moin moin! Also ich hab volgendes Prob bei meinen C Programmierversuchen. Ich kann wunderbar Tabs, Blanks, Zeichen und Zeilen zählen aber was ist mit der Backspace Taste??? Die will ich auch haben! Kann mir jemand verraten ob dies überhaupt möglich ist??? Also ich will die Betätigung der Backspace Taste zählen und ausgeben! Wie ich es ausgeben kann weiß ich aber nich wie ich die zählen kann! :cool: Danke schon mal! Dirk
10. November 200519 j Moin moin! Also ich hab volgendes Prob bei meinen C Programmierversuchen. Ich kann wunderbar Tabs, Blanks, Zeichen und Zeilen zählen aber was ist mit der Backspace Taste??? Die will ich auch haben! Kann mir jemand verraten ob dies überhaupt möglich ist??? Also ich will die Betätigung der Backspace Taste zählen und ausgeben! Wie ich es ausgeben kann weiß ich aber nich wie ich die zählen kann! :cool: Danke schon mal! Dirk Also der Ascii-Code für Backspace ist 0x08, wenn ich mich nicht irre, also bitte noch mal in der ascii tabelle schauen. Der Rest sollte dann analog zum zählen der anderen Zeichen funktionieren. Eventuell kannste ja mal deinen Code posten, das funktioert nämlich nur wenn Du Zeichenweise von der Konsole liest.
10. November 200519 j jo das 0x08 der ascii code ist hab ich schon nachgeschaut, ich lese die zeichen einzeln über konsole ein! code ausschnitt hier: else { if (zeichen == 0x08) { ++anz_backsp; /* zaehlen der backspace */ anz_backsp_g = anz_backsp_g + 1; } bei den anderen zähl ich auch so! kann man auch mit switch machen, weiß ich, aber ich fang erst an Ausgabe dann mit : printf ("Anzahl Backspace = <%d> \n", anz_backsp_g);
10. November 200519 j Wie liest du die Zeichen denn ein und hast du mal im Debuger geuckt was genau passiert wenn du Backspace drückst?
11. November 200519 j also ich mach den kram unter linux und wenn ich mir ausgeben lasse welche Tastatureingaben ich mache kommt für´s backspace dat hier : ^?<127> sorry ich kann nichts genaueres dazu sagen weil der vi editor den ich benutze keinen wirklichen debugger hat!!!!
11. November 200519 j Backspace ist ASCII 8 127 ist <Del> warum machst du nicht if (zeichen == 8) { ?
11. November 200519 j ääääm weils nicht geht!!!! ausserdem müsste ich 0x08 schreiben weil Backspace HEX 8 ist im ASCII das funktioniert aber auch nicht !! leider
11. November 200519 j wenn zeichen char ist (was ich denke) und du eins einließt dann bekommt zeichen den wert 8 (siehe debugger) 8 und 0x08 sind eh das gleiche warum prüfst du ne auf '\b' ?
11. November 200519 j wenn zeichen char ist (was ich denke) und du eins einließt dann bekommt zeichen den wert 8 (siehe debugger) 8 und 0x08 sind eh das gleiche warum prüfst du ne auf '\b' ? also das funktioniert auch nicht!!! ich hab \b und den ascii code probiert funzt beides nicht!!! das is ja das problem ich probier das was logisch wäre es geht aber alles nicht! ich mein wenn ich andere zeichen eingeben und die backspace drücke werden die zeichen gelöscht und in der ausgabe stehen dann auch weniger, also wenn ich 3 eingebe und einmal bspace drücke dann zählt er 2 is ja toll un richtig aber ich will die anzahl der bspace auch sehen also müsste dann das bei BS = 1 stehen
11. November 200519 j ++anz_backsp; /* zaehlen der backspace */ anz_backsp_g = anz_backsp_g + 1; warum machst du einmal präfix-Inkrement und einmal +1 ? beides int oder? warum 2 variablen? wo zählt er zurück?
11. November 200519 j ++anz_backsp; /* zaehlen der backspace */ anz_backsp_g = anz_backsp_g + 1; warum machst du einmal präfix-Inkrement und einmal +1 ? beides int oder? warum 2 variablen? wo zählt er zurück? ja is nen bissel blöd, aber zr erklörung ++anz_backspace ist für die backspace in der zeile und anz_backsp_g ist für die ausgabe aller backspace tasten!!! also es sind 2 verschiedene berechnungen ich hätte auch ++anz_backspace_g schreiben können hab ich aber nich frag nich warum
11. November 200519 j Normalerweise bekommst Du das Zeichen bei getchar() erst nachdem du return eingegeben hast, dann geht das Backspace natürlich unter, weil es gar nicht im Puffer steht. Also poste doch mal bitte die komplette Eingaberoutine mit der analysefunktion, damit man sich das mal komplett anschauen kann, fehler suchen in codefragmenten ist nicht grade besonders effektiv
11. November 200519 j #include <stdio.h> main() { int zeichen; int anz_zeilen, anz_tabs, anz_backsp, anz_blanks, anz_zeichen_gesamt, anz_tabs_g, anz_backsp_g, anz_blanks_g, anz_zeichen; /* lokale Variablen initialisieren */ anz_zeilen = 0; anz_tabs = 0; anz_backsp = 0; anz_blanks = 0; anz_zeichen = 0; anz_zeichen_gesamt = 0; anz_tabs_g = 0; anz_backsp_g = 0; anz_blanks_g = 0; while ((zeichen = getchar()) != EOF) { printf("<%d> \n", zeichen); if (zeichen == '\n') { ++anz_zeilen; printf("\nZeichen in der Zeile = <%d> \n", anz_zeichen); printf("Tabs in der Zeile = <%d> \n", anz_tabs); printf("BS in der Zeile = <%d> \n", anz_backsp); printf("Blanks in der Zeile = <%d> \n", anz_blanks); anz_zeichen = 0; anz_tabs = 0; anz_backsp = 0; anz_blanks = 0; } else { ++anz_zeichen; anz_zeichen_gesamt = anz_zeichen_gesamt + 1; if (zeichen == '\t') { ++anz_tabs; /* zaehlen der tabs */ anz_tabs_g = anz_tabs_g + 1; } else { if (zeichen == 0x8) { ++anz_backsp; /* zaehlen der backspace */ anz_backsp_g = anz_backsp_g + 1; } else { if (zeichen == 0x20) { /* 0x20 ist blank = ' ' */ ++anz_blanks; anz_blanks_g = anz_blanks_g + 1; } } } } } printf ("\nAnzahl Zeichen = <%d> \n", anz_zeichen_gesamt); printf ("Anzahl Zeilen = <%d> \n", anz_zeilen); printf ("Anzahl Tabs = <%d> \n", anz_tabs_g); printf ("Anzahl Backspace = <%d> \n", anz_backsp_g); printf ("Anzahl Leerzeichen = <%d> \n", anz_blanks_g); ich kann die tastatur eingabe mit system("stty raw") ausschalten dann seh ich sofort meine tastatur eingaben, aber ich bekomm die blöden bspaces trotzdem nicht gezählt
11. November 200519 j Normalerweise bekommst Du das Zeichen bei getchar() erst nachdem du return eingegeben hast, dann geht das Backspace natürlich unter, weil es gar nicht im Puffer steht. erm... nein ? getchar ließt nur ein Zeichen ein (deswegen auch getchar und nicht getchars)
11. November 200519 j soweit ich das beurteilen kann liegt UltimateRuppi richtig! genau so is es nämlich in meinem prog!
11. November 200519 j erm... nein ? getchar ließt nur ein Zeichen ein (deswegen auch getchar und nicht getchars) Was du meinst ist getch() aus der conio.h, die gibbet unter linux aber IMO nicht. jedenfalls standardmäßig nicht #include <stdio.h> int main() { char c; c = getchar(); while ((c != EOF) && (c != 0x10)) { printf("%02X ", c); c = getchar(); } return 0; } [/PHP] Wenn du das mal laufen lässt wirst du sehen, dass getchar() mehrere Zeichen aus der Konsole liest (bis return gedrückt wird) beim erneuten aufruf werden soweit noch vorhanden die restlichen Zeichen der Zeile urückgegeben, sind keine mehr da wird erneut von der Konsole gelesen. Die Backspace zeichen werden auf jeden fall nicht mit gelesen, da die standard IO die bereits herausfiltert da solltest Du dich wohl man mit curses oder ncurses beschäftigen, ich glaube die haben entsprechende funktionen für linux um direkt die zeichen aus der konsole zu erhalten. Hab das mal irgendwo gelesen, also wenn das nicht stimmt bitte korrigieren
11. November 200519 j Was du meinst ist getch() aus der conio.h, die gibbet unter linux aber IMO nicht. jedenfalls standardmäßig nicht Wenn du das mal laufen lässt wirst du sehen, dass getchar() mehrere Zeichen aus der Konsole liest (bis return gedrückt wird) ja weil bei return die schleife abgebrochen wird beim erneuten aufruf werden soweit noch vorhanden die restlichen Zeichen der Zeile urückgegeben, wie ? soweit noch vorhanden ? wieso erneueter aufruf ? meinst du neuen schleifendurchlauf ? sind keine mehr da wird erneut von der Konsole gelesen. du kannst ne mehrere zeichen mit getchar lesen wenn das nur ein einfaches int zurückgibt... Ich habs vorhin im Debugger getestet und es ging einwandfrei
11. November 200519 j haste das mal ausgeführt? ich denke nicht, wenn du test (mit anschliessendem return) eingibst, dann steht hinterher auf der konsole folgendes test 74 65 73 74 0A Also bedient er sich beim zweiten Aufruf noch aus dem Zeichenvorrat des Eingabepuffers, du kannst die überprüfung auf 0x10 ja mal rausnehmen und schauen was passiert EDIT: hoppla, mir fällt grade auf, dass das ja eine Endlosschleife ist (also nix mir rausspringen aus der chleife TDM) (c != 0x10) ist natürlich schwachsinn (c != 10 ) bzw. (c != 0x0A) muss es heissen
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.