Helmut Schellong <
r...@schellong.biz>:
>On 05/07/2022 23:24, Claus Reibenstein wrote:
>> Es kann sich auch lohnen, die ursprüngliche Frage genau zu lesen,
>> sie zu verstehen und erst dann zu antworten.
>>
>
>Die ursprüngliche Frage ist:
>
>|Ich möchte eine Eingabe für scanf vorgeben, so das man in der
>|Konsole nur noch ohne weitere Eingabe die Returntaste drücken
>|muss.
>
>Ich bin offenbar der Einzige, der sie ernst genommen und verstanden
>hat,
Du hast sie nicht erfasst, denn du hast den zweiten Teil der
Aufgabenstellung ignoriert. Vollständig lautet die Aufgabenstellung
so:
«Ich möchte eine Eingabe für scanf vorgeben, sodass man in der
Konsole nur noch ohne weitere Eingabe die Returntaste drücken muss.
puts/putchar schreiben offenbar nicht in den Buffer für scanf.»
Und jetzt kommt die entscheidende Frage, die du dir hättest stellen
müssen: Was will der Aufgabensteller mit dem letzten Satz andeuten?
Antwort: Er hat erstens erwartet, dass er mit puts/putchar den für
scanf zuständigen Eingabepuffer vor‐ausfüllen kann, damit er, wenn
er mit dem vorausgefüllten Eingabetext zufrieden ist, nur noch die
Returntaste drücken muss und dadurch trotzdem, obwohl er den
vorausgefüllten Text nicht selber eingetippt hat, beim Aufruf der
scanf‐Funktion ein Ergebnis erhält, als hätte er ihn eingetippt, und
zweitens erfahren, dass er das Vor‐Ausfüllen mit puts/putchar nicht
hinbekommt.
>einschließlich des Aufgabenstellers.
>
Der Aufgabensteller hat im Gegensatz zu dir seine Frage verstanden.
Nicht gewusst hat er jedoch, dass Eingabe von einem Terminal und
Ausgabe auf das Terminal zwei verschiedene Paar Schuhe sind, die,
obwohl beide ein sichtbares Resultat im Terminal hinterlassen (es
sei denn, man hätte das Terminal‐Echo abgeschaltet), nichts mit
einander zu tun haben.
>Ich wollte somit eine Lösung für _scanf_ verfolgen, wie es das
>Lastenheft vorgibt.
Die richtige Antwort auf das Lastenheft wäre die folgende
zweigeteilte gewesen:
(1.) Das von dir gewünschte geht nicht: Man kann den
Terminal‐Eingabepuffer für zeilenweise Eingabe nicht durch eine
Ausgabe vor‐ausfüllen, weil Terminal‐Ein‐ und Ausgabe nichts mit
einander zu tun haben, obwohl es so aussieht, als hätten sie es.
Deshalb muss
(2.) die von dir gewünschte Verbindung – im Eingabepuffer steht
jederzeit das, was auf dem Terminal geschrieben steht – vom Programm
selber simuliert werden. Man schaltet dazu das Terminal in eine
Betriebsart um, die es dem Programm ermöglicht, jedes Zeichen, das
man tippt, sofort vom Terminal zu erhalten, obwohl man die
Returntaste noch gar nicht getippt hat. Dann kann das Programm
entsprechend reagieren: Ist das gelesene Zeichen ein druckbares
Zeichen, muss es erstens im simulierten Eingabepuffer abgelegt und
zweitens auf dem Terminal ausgegeben werden. Ist es jedoch ein
Steuerzeichen – beispielsweise das, was das zuletzt eingetippte
Zeichen aus dem Eingabepuffer und vom sichtbaren Text im Terminal
löschen und die Schreibmarke eine Position zurücksetzen soll, muss
erstens das zuletzt im simulierten Eingabepuffer abgelegte Zeichen
aus dem simulierten Eingabepuffer entfernt werden und zweitens das
im Terminal sichtbare zuletzt eingetippte Zeichen mit einem
Leerzeichen überschrieben und die Position der Schreibmarke dorthin
gesetzt werden, wo das überschriebene Zeichen stand. Das alles muss
man aber nicht selber programmieren, weil es dafür fertige Libraries
(readline, …) gibt. Mit einem einfachen scanf ist es dabei nicht
mehr getan.