Forum: PC-Programmierung Wie funktioniert der Tastaturbuffer?


von LuisBaatz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich lerne gerade C für mein Studium (haben erst vor drei Wochen 
begonnen) und wir arbeiten mit scanf. Unser Prof hat das Thema 
Tastaturpuffer aber leider nicht richtig erklärt und ich stehe 
dementsprechend auf dem Schlauch.


(Siehe Tastaturbuffer.png)


Hier ist die ganze Sache ja noch sehr verständlich.

Eine Zahl wird eingelesen. Diese Eingabe wird mit \n bestätigt. Das in 
der letzten Zeile eingegeben \n befindet sich in diesem Tastaturpuffer 
und  wird jetzt automatisch im zweiten scanf eingegeben. Damit wird 
dieses scanf "Übersprungen" und der Variable "Dummy" das \n  zugewiesen.


(Siehe TastaturbufferAdvanced.png)


Eine Zahl und ein Zeichen wird eingelesen. Wenn jetzt sowohl das Zeichen 
als auch das \n in dem Tastaturpuffer gespeichert ist, dann müsste ich 
eine 7 ein A und einen Zeilenumbruch aus Ausgabe bekommen. Das Passiert 
aber nicht.

Wenn nur das A in dem Tastaturpuffer gespeichert ist, dann müsste ich 
eine 7 ein A und die Möglichkeit erhalten, ein neues Zeichen einzugeben. 
Das Passiert aber auch nicht.

Stattdessen erhalt ich einfach nur eine 7 und ein A und der Code wird 
beendet. Warum?


Hier die beiden Codes:
#include <stdio.h>


int main(void)
{
    int zahl;
    char zeichen;

    printf("Geben Sie eine Zahl ein\n");
    scanf("%d", &zahl);
    getchar();
    printf("Geben Sie ein Zeichen ein\n");
    scanf("%c", &zeichen);
    getchar();


    printf("Zahl: %d\n", zahl);
    printf("Zeichen: %c\n", zeichen);
    return 0;
}

Und

#include <stdio.h>

int main(){
    int Zahl;
    char Dummy2;
    char Dummy;


    printf("\ngeben Sie bitte eine ganze Zahl und ein Zeichen ein:");
    scanf("%d", &Zahl);
    printf("%d", Zahl);

    scanf("%c", &Dummy);
    printf("%c", Dummy);

    scanf("%c", &Dummy2);
    printf("%c", Dummy2);

    return 0;
}

von LuisBaatz (Gast)


Lesenswert?

> int main(void)
> {
>     int zahl;
>     char zeichen;
>
>     printf("Geben Sie eine Zahl ein\n");
>     scanf("%d", &zahl);
>     getchar();
>     printf("Geben Sie ein Zeichen ein\n");
>     scanf("%c", &zeichen);
>     getchar();
>
>     printf("Zahl: %d\n", zahl);
>     printf("Zeichen: %c\n", zeichen);
>     return 0;
> }
Falscher Code!!!
Hie der richtige:

#include <stdio.h>

int main(){
    int Zahl;
    char Dummy;

    printf("geben Sie bitte eine ganze Zahl ein:");
    scanf("%d", &Zahl);

    scanf("%c", &Dummy);
    printf("%c", Dummy);

    return 0;
}

von Michael B. (laberkopp)


Lesenswert?

LuisBaatz schrieb:
> Stattdessen erhalt ich einfach nur eine 7 und ein A und der Code wird
> beendet. Warum?

Was erwartest du als Ausgabe eines \n zu sehen ?

von Hr. Kartenga (Gast)


Lesenswert?

> Unser Prof hat das Thema Tastaturpuffer aber leider nicht richtig erklärt
> und ich stehe dementsprechend auf dem Schlauch.

Bei diesem Satz habe ich mit dem Lesen aufgehört. Das ist lahmste 
Ausrede, die sich dumme bzw. faule Studenten*1 einfallen lassen.

[1]
Nicht gegendert, da diese Ausrede von Studentinnen nicht verwendet wird.

von LuisBaatz (Gast)


Lesenswert?

> Was erwartest du als Ausgabe eines \n zu sehen ?

Ja genau das!!. Also im ersten Code sehe ich ja das \n warum hier nicht?

von LuisBaatz (Gast)


Lesenswert?

Hr. Kartenga schrieb:
>> Unser Prof hat das Thema Tastaturpuffer aber leider nicht
> richtig erklärt
>> und ich stehe dementsprechend auf dem Schlauch.
>
> Bei diesem Satz habe ich mit dem Lesen aufgehört. Das ist lahmste
> Ausrede, die sich dumme bzw. faule Studenten*1 einfallen lassen.
>
> [1]
> Nicht gegendert, da diese Ausrede von Studentinnen nicht verwendet wird.

Hallo,

1.Ich lerne jeden Tag min. 12h.

2.Wir haben gerade Corona. Unser info prof gibt keine Vorlesungen 
sondern filmt seinen Bildschirm mit der Kamera ab und lädt diese Videos 
dann hoch.
Wir haben nicht die Möglichkeit ihm direkt fragen zu stellen und eine 
Mail braucht min. 2 Tage bis sie beantwortet wird.
Das da etwas nicht richtig erklärt wird ist keine faule Ausrede sondern 
leider Realität.

von Alexander S. (alesi)


Lesenswert?

Hallo LuisBaatz,

wie genau sehen deine Eingaben aus? scanf überspringt whitespace, also 
z.B. ' ' oder '\n'.
TastaturbufferAdvanced liefert jeweils:
Eingabe  -->  Ausgabe
"7A\n"   -->  "7A\n"
"7 A\n"  -->  "7 A"
"7AB\n"  -->  "7AB"

Die "" dienen nur der Identifikation von Eingabeanfang und -ende und
werden nicht ein- oder ausgegeben.

Was ist deine Erwartung für die Ausgaben bei diesen Eingaben?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

LuisBaatz schrieb:
> Das da etwas nicht richtig erklärt wird ist keine faule Ausrede sondern
> leider Realität.
Doch ist es, du bist nicht mehr in der Grundschule wo dir deine Mutter 
beim Arsch abwischen noch die Hand führt. Der Prof soll euch Anregungen 
geben in  was ihr euch selbsttätig einarbeiten sollt und euch eben nicht 
mehr jedes Wort vorkauen.
Sowas selbst zu recherchieren dauert heutzutage keine 10 Minuten...

von Der Prof (Gast)


Lesenswert?

Früher stellte man eine Frage ins Forum, dann bekam man zumindest Hilfe 
oder keine Hilfe.
Heute wird man mit Scheiße beworfen (so wie Affen es tun), wenn man nur 
daran denkt einen Forum zu besuchen.

unfassbar!

von PittyJ (Gast)


Lesenswert?

Wenn ich auf der Konsole 'man scanf' eingeben, bekomme ich eine 
seitenlange Erklärung.
Wenn ich im Browser oben rechts scanf eingebe, dann findet Google
Ungefähr 3.930.000 Ergebnisse (0,39 Sekunden)

Geht das bei Studenten wegen Corona jetzt nicht mehr?

Früher hat man komplette Programmiersprachen mit nur einem Buch und 
Trial&Error gelernt.

von Alexander S. (alesi)


Lesenswert?

"If you look for help you may find people are not patient with you. You 
may find that, rather than help, they take the time to express how much 
they know about the subject. Experienced programmers might tell you that 
you are wrong. The subtext to their tone might be that you should stop 
now, rather than inflict your bad code on the world.

After a couple of engagements like this you may decide that you are not 
a programmer, or don't really like programming, or that you just don't 
get it. You may have thought that you once enjoyed the idea of building 
your own programming language, but now you have realised that it is too 
abstract and you don't care any more. You are now concerned with your 
other passions, and any insight that may have been playful, joyful or 
interesting will now have become an obstacle.

For this I can only apologise. Programmers can be hostile, macho, 
arrogant, insecure, and aggressive. There is no excuse for this 
behaviour. Know that I am on your side. No one gets it at first. 
Everyone struggles and doubts their abilities. Please don't give up or 
let the joy be sucked out of the creative experience. Be proud of what 
you create no matter what it is. People like me don't want you to stop 
programming. We want to hear your voice, and what you have to say."

http://buildyourownlisp.com/chapter1_introduction

von Dr. Glotze (Gast)


Lesenswert?

Alexander S. schrieb:
> "If you look for help you may find people are not patient with you. You
> may find that, rather than help, they take the time to express how much
> they know about the subject.
> For this I can only apologise. Programmers can be hostile, macho,
> arrogant, insecure, and aggressive. There is no excuse for this
> behaviour.

Mumpitz, der böse Bube hier ist eindeutig der TO der seinen Job 
(Grundlagen des Programmierenes sich aneignen) auf andere abwälzen will.

Da steht eigentlich alles:
Beitrag "Re: Wie funktioniert der Tastaturbuffer?"

Hilf Dir selbst, dann hilft Dir Gott!

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Da ich aus meiner eigenen Studienzeit die Unfähigkeit mancher 
Professoren und Tutoren noch sehr gut kenne, ist das was der TO erzählt 
für mich durchaus glaubhaft und nachvollziehbar. Und da es an vielen 
Universitäten in dem Bereich mehr als düster aussieht, kann man auch mal 
ein brauchbares Ergebnis liefern, da sonst mit Google auch nur ein 
weiteres, nicht zielführendes Ergebnis gefunden wird.

Also das Problem ist, nach Eingabe des Enterzeichens nach der Zahl 
bleibt das Enterzeichen im Tastaturpuffer stehen weil es nicht mit 
eingelesen wird. Aus diesem Grund wird das Enterzeichen (Newline) beim 
nachfolgenden Einlesen als Zeichen gelesen und nicht das eigentliche 
Zeichen was nach dem Newline kommen sollte.

Die einfachste Möglichkeit das zu ändern ist ein Newline oder 
Leerzeichen vor dem Formatspezifizierer, der dafür sorgt dass das 
Newline oder alle Whitespaces vor dem eigentlichen Zeichen verworfen 
werden:
1
int main(void) {
2
 int zahl;
3
 char zeichen1, zeichen2;
4
5
 printf("Geben Sie eine Zahl ein:");
6
 scanf("%d", &zahl);
7
 
8
 printf("Geben Sie ein Zeichen ein:");
9
 scanf("\n%c", &zeichen1);
10
11
 printf("Geben Sie ein Zeichen ein:");
12
 scanf(" %c", &zeichen2);
13
14
 printf("Zahl: %d\n", zahl);
15
 printf("Zeichen: %c\n", zeichen1);
16
 printf("Zeichen: %c\n", zeichen2);
17
18
 return 0;
19
}

von c-hater (Gast)


Lesenswert?

PittyJ schrieb:

> Früher hat man komplette Programmiersprachen mit nur einem Buch und
> Trial&Error gelernt.

Notfalls sogar ohne Buch...

Wobei ein didaktisch gut aufgebautes Buch natürlich eine sehr wertvolle 
Hilfe ist und vieles im Lernprozess deutlich beschleunigen kann. 
Insbesondere, wenn man ohne vertiefte Vorkenntnisse aus anderen Sprachen 
einsteigt oder in eine komplett andere Sprachfamilie als die bisher 
bekannten.

Ich fand am schwierigsten bisher: Einstieg in objektorientierte 
Programmierung (trotz umfassender Vorkenntnisse rein prozeduraler 
Programmierung). Und: Einstieg in SQL (trotz umfassender Vorkenntnisse 
sowohl prozeduraler als auch OO-Programmierung und in diesem Kontext 
bereits massiv  genutzter einfacher SQL-Abfragen).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.