Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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

ääääm weils nicht geht!!!! ausserdem müsste ich 0x08 schreiben weil Backspace HEX 8 ist im ASCII das funktioniert aber auch nicht !! leider

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

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

was nimmst du als eingabe ? cin, scanf, getch ?

ich nehme getchar


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


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

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

#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

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)

mist falsches posting

soweit ich das beurteilen kann liegt UltimateRuppi richtig! genau so is es nämlich in meinem prog!

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

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.