Forum: PC-Programmierung Wie funktioniert der Tastaturbuffer?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von LuisBaatz (Gast)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.