Zum Inhalt springen

Backspace Tastendruck auslesen / zählen


Empfohlene Beiträge

Geschrieben

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! :P:D

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

Geschrieben
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! :P:D

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.

Geschrieben

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);

Geschrieben

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!!!!

Geschrieben

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' ?

Geschrieben
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

Geschrieben


++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?

Geschrieben

++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 :D

Geschrieben

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

Geschrieben

#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

Geschrieben
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)

Geschrieben
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

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...