Wo liegen die Unterschiede zw. getchar/putchar und scanf/printf?

...komplette Frage anzeigen

3 Antworten

Eine ordentliche C Referenz solltest du immer zur Hand/in den Lesezeichen haben, wie http://en.cppreference.com/w/c .

getchar liest ein Zeichen aus dem Standard Eingabe Stream, üblicherweiser der Konsole.

putchar stellt das Ausgabe-Äquivalent dar, also schreibt ein Zeichen in den Standard Ausgabe Stream (ebenfalls die Konsole wenn nicht umgeleitet).

Diese beiden Funktionen tuen also nicht viel und sind daher an sich günstig, nur werden normalerweise viele Zeichen geschrieben/gelesen und das öftere Aufrufen der Funktionen rächt sich.

scanf liest verschiedene Daten nach Nutzerwunsch aus dem Standard Eingabe Stream ein. In der Formatbeschreibung als ersten Parameter wird angegeben, was (und wie) versucht werden soll aus dem Stream zu lesen und in die folgenden Pointer reinzuschreiben.

printf bildet das Ausgabe-Äquivalent, wobei verschiedene Daten in die Formatbeschreibung eingesetzt werden können und das Ergebnis in den Standard Ausgabe Stream fließt.

Diese beiden Funktionen arbeiten mit Formatierungen, erlauben also ein Suchmuster bzw. Zusammenfügen von Daten und sind somit bequemer unter bestimmten Anforderungen, aber auch teuer wegen ihrer potenziellen Fähigkeiten.

Nun gibt es noch viele weitere Input/Output Funktionen, welche alle ihre Daseinsberechtigung aufgrund ihrer Vorteile unter gewissen Umständen haben.

scanf ruft intern sowas wie getchar auf und verarbeitet es nach dem übergebenen Muster schon weiter. Das Ergebnis ist dann in den gwünschten Datentyp konvertiert. printf ruft intern auch sowas wie putchar auf, nur dass es deine Daten vorher in char-Arrays konvertiert.

oder anders gesagt: geltchar und putchar sind relativ low-level, scanf und printf schon high-level. Darum muss man sich aber nur bei stark begrenzten Hardwareressourcen Gedanken machen (scanf und printf brauchen eimen relativ großen Speicherteil für den Code).

Richtig, put- und getchar verarbeiten nur ein einziges Zeichen.

Das Getchar braucht man sehr oft. Immer wenn es heißt "Beliebige Taste drücken", dann steht da so etwas wie getchar dahinter.

Würde man da ein Scanf benutzen, dann müsste es heißen "Beliebige Taste drücken und mit Enter bestätigen".

Macht nicht viel Sinn, oder?

AUch bei Menüs wo man eine Auswahl zwischen verschiedenen Tasten hat macht es nicht viel Sinn nach dem Tastendruck noch Enter zu drücken.

Und wenn man eine Linie aus - zeichnen will, macht printf ebenfalls keinen Sinn da man hier viel Speicher und Zeit verschwendet. ein simples:

char n=40;
while (n--) putchar('-');

reicht hier um 40x ein "-" hintereinander auszugeben. Vor allem wenn die Linie eine variable Länge hat müsste man für jede Linienlänge ein eigenes Printf vorbereiten und mit switsch case auswählen.

Youkakun 25.06.2015, 16:07

Das Getchar braucht man sehr oft.

Eigentlich nicht, es dient für gewöhnlich bei Anfängerübungen unter Windows. Normalerweise werden "Konsolenprogramme" bereits in der Konsole ausgeführt und somit keine Eingabeaufforderung für das Offenhalten der Konsole benötigt.

Immer wenn es heißt "Beliebige Taste drücken", dann steht da so etwas wie getchar dahinter.

Diese Meldung kommt unter Windows beim Systembefehl pause, unter Linux wird einfach read mit vorgehangenen Text genutzt. getchar zeigt gar nichts an und wartet auf Enter, ist dafür plattformunabhängig. Du meinst wahrscheinlich das nicht standardisierte getch.

ein simples:

char n=40;
while (n--) putchar('-');

reicht hier um 40x ein "-" hintereinander auszugeben.

Was keine gute Praxis ist, besonders nicht, wenn der Stream kein Buffering anwendet, wie meist bei Konsolenausgabe. Lieber puts verwenden und den String per memset füllen.

0
Commodore64 27.06.2015, 16:34
@Youkakun

Das ist dann aber für Fortgeschrittene.

Bei Mikrocontrollern macht man es heute oft noch "á la putchar", hier hält man den Betrieb an bis der Sendepuffer wieder frei ist. Oder - fortgeschritten - macht sich eine Interruptgesteuerte Funktion die dann diese Aufgabe effizient macht ohne den Betrieb anzuhalten.

0

Was möchtest Du wissen?