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

3 Antworten

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).

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.

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.

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
@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

Unicode/ASCII in C mit printf() in der Konsole darstellen.

Servus, ich möchte mit der printf()-Funktion Unicode/ASCII in der Konsole darstellen (Programmiersprache: C). ASCII wird problemlos dargestellt, bei Unicode werden fehlerhafte Zeichen dargestellt bzw. nicht die Zeichen, die ich möchte.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("AE: \x8E\n");
    printf("OE: \x99\n");
    printf("UE: \x9A\n");
    printf("SS: \xE1\n");
    char h_doubleline = '\u2550';
    char v_doubleline = '\u2551';
    printf("Doppelte horizontale Linie: %c\n", h_doubleline);
    printf("Doppelte vertikale Linie: %c\n", v_doubleline);
    int input = getchar(); //Eingabeanfrage, damit das Programm nicht beendet wird.
    return 0;
}

Wie kann ich Unicode richtig einfügen, sodass die richtigen Zeichen angezeigt werden? MfG.

...zur Frage

Richtige Programmiersprache für das Projekt (3D Minesweeper)

Guten Abend liebe Leute!

Habe soeben meinen dritten Master erworben und beginne jetzt den vierten Bachelor, in Biomedical Engineering.. Wie man sich vorstellen kann werde ich hier mit einigen Programmiersprachen konfrontiert - großteils Neuland für mich - und um diese spielend zu lernen habe ich mir als ersten Meilenstein gesetzt, ein 3D Minesweeper Spiel zu programmieren. Ich würde dies am liebsten in C machen, egal wie umständlich das sein mag, da C eine der wichtigsten Sprachen in biomed ist. Meine Frage: Ist das überhaupt möglich? Ich kann es mir in C# vorstellen, aber in C?

Freue mich auf eure Antworten! Erklärungen zum Wieso und Wie sind Beste Antwort material!

...zur Frage

System "Pause" in C - wie verhindert man in C, dass sich das Fenster nach dem Debug nicht gleich wieder schließt?

Wie kann man das am schönsten lösen? Danke für die Antworten! :-)

...zur Frage

Was macht fflush und warum benötigt man es in folgendem Fall?

Das ist das Programm (C++), um das es geht.

int main(void)

{

int a,b;
scanf("%i", &a);
scanf("%i", &b);
printf("Die Summe von %i und %i ist %i.", a, b, a+b);
fflush(stdin);
getchar();
return 0;

}

Und jetzt frage ich mich, wozu ich das fflush(stdin) benötige. Ich weiß, dass es den Speicher löscht, also in dem Fall halt das was mit der Standardeingabe, sprich Tastatur, eingegeben wurde. Und dass wenn man es weglässt, sich das Fenster auch mit getchar sofort wieder schließt ohne dass man von dem printf viel mitkriegt, aber ich verstehe nicht warum.

getchar sorgt doch eigentlich dafür, dass sich das Fenster erst bei Drücken von Enter wieder schließt, oder? Klar, nach jedem scanf muss man zum Bestätigen der Zahl Enter drücken. Nimmt das zweite Enter dann gleich getchar, oder wie?

Und dann hätte ich noch eine Frage. Da fflush(stdin), nach dem was viele sagen, eigentlich undefiniertes Verhalten hat, auch wenn viele Compiler es trotzdem schlucken...was soll es denn normal machen? Ich hab irgendetwas mit Puffer gelesen, aber kapiert habe ich es nicht. Wäre nett, wenn mir das auch jemand erklären könnte.

...zur Frage

c# oder Java besser?

Hallo zusammen, ich habe vor kurzem meine Ausbildung zum Staatl. gepr. Wirtschaftsinformatiker abgeschlossen. In Rahmen dieser Ausbildung habe ich Programmiersprachen wie VB, Java aber auch Scriptsprachen wie JavaScript und PHP kennen gelernt. Ich habe nun eine Stelle als Anwendungsentwickler für ERP Software (NAV). Da ich in der Tätigkeit nichts mehr mit den erlernten Grundlagen zu tun habe, bin ich am überlegen, ob ich mich privat etwas intensiver mit Java oder eben C# beschäftigen soll?

Meine Kenntnisse in Java würde ich auf einer Skala von 1-10 auf 6,5 einschätzen. Vor kurzem habe ich mir ebenfalls ein wenig C# angeschaut, welches mir eher als Java zusagt. An dieser Stelle würde ich einfach nur wissen wollen, welche Sprache mir künftig die besseren Vorteile in meiner beruflichen Laufbahn bringen könnte? natürlich ganz unabhängig von meiner jetzigen Tätigkeit.

Mit freundlichen Grüßen

...zur Frage

Was möchtest Du wissen?