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; }
> 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; }
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 ?
> 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.
> Was erwartest du als Ausgabe eines \n zu sehen ?
Ja genau das!!. Also im ersten Code sehe ich ja das \n warum hier nicht?
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.
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?
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...
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!
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.
"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
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!
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.