HubbeldiBUBB Geschrieben 10. November 2005 Geschrieben 10. November 2005 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 Zitieren
UltimateRuppi Geschrieben 10. November 2005 Geschrieben 10. November 2005 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. Zitieren
HubbeldiBUBB Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 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); Zitieren
Guybrush Threepwood Geschrieben 10. November 2005 Geschrieben 10. November 2005 Wie liest du die Zeichen denn ein und hast du mal im Debuger geuckt was genau passiert wenn du Backspace drückst? Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 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!!!! Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 Backspace ist ASCII 8 127 ist <Del> warum machst du nicht if (zeichen == 8) { ? Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 ääääm weils nicht geht!!!! ausserdem müsste ich 0x08 schreiben weil Backspace HEX 8 ist im ASCII das funktioniert aber auch nicht !! leider Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 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' ? Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 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 Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 was nimmst du als eingabe ? cin, scanf, getch ? Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 was nimmst du als eingabe ? cin, scanf, getch ? ich nehme getchar Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 ++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? Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 ++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 Zitieren
UltimateRuppi Geschrieben 11. November 2005 Geschrieben 11. November 2005 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 Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 #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 Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 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) Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 mist falsches posting Zitieren
HubbeldiBUBB Geschrieben 11. November 2005 Autor Geschrieben 11. November 2005 soweit ich das beurteilen kann liegt UltimateRuppi richtig! genau so is es nämlich in meinem prog! Zitieren
UltimateRuppi Geschrieben 11. November 2005 Geschrieben 11. November 2005 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 Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 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 Zitieren
UltimateRuppi Geschrieben 11. November 2005 Geschrieben 11. November 2005 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 Zitieren
TDM Geschrieben 11. November 2005 Geschrieben 11. November 2005 ok, hast recht... soll er sich halt ne funktion getch schreiben *g* Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.