Eingaben sind das Lebenselixier jedes interaktiven Programms. Ohne sie betreiben Sie nur einen Taschenrechner im luftleeren Raum. In der Programmiersprache C ist „scanf“ das Arbeitstier zum Erfassen von Daten von der Tastatur. Es ist einfach. Es ist überall. Aber es ist auch dafür berüchtigt, unversöhnlich zu sein, wenn etwas schief geht.
Für einfache Skripte oder schnelle Prototypen erledigt „scanf“ die Aufgabe. Es liest von „stdin“ (Standardeingabe). Wenn Sie auf einer Tastatur tippen, landen Ihre Zeichen dort. Die Funktion ist vielseitig, es mangelt ihr jedoch an einer robusten Fehlerbehandlung. Es spielt keine Rolle, ob Sie einen Buchstaben eingeben, wenn eine Zahl erwartet wird. Es wird einfach dort bleiben oder, schlimmer noch, Ihr Programm zum Absturz bringen. Aus diesem Grund eignet es sich hervorragend für einfache Aufgaben, eignet sich jedoch schlecht für Software in Produktionsqualität.
Die Syntax und das kaufmännische Und-Zeichen
Schauen wir uns den einfachsten möglichen Anwendungsfall an. Sie möchten eine Ganzzahl. Du fragst danach. Sie speichern es.
scanf("%d", &b);
Das ist es. Zwei Argumente. Die Formatzeichenfolge und das Ziel.
Das „%d“ weist „scanf“ an, eine Ganzzahl zu erwarten. Es ist derselbe Platzhalter, den Sie in „printf“ verwenden. Die Variable „b“ muss als „int“ deklariert werden. Wenn nicht, fordern Sie Ärger.
Hier ist der Teil, der Anfänger jedes Mal aus der Fassung bringt: das kaufmännische Und-Zeichen („&“).
„&b“ ist kein Tippfehler. Es ist ein Hinweis. Konkret handelt es sich um die Adresse der Variablen „b“. „scanf“ nimmt den Wert nicht an; Es benötigt den Speicherort, in den die Eingabe geschrieben werden soll. Vergessen Sie das „&“. Ihr Code könnte kompiliert werden. Aber wenn Sie es ausführen? Absturz. Segfault. Leere. Das Programm wird mit ziemlicher Sicherheit abrupt beendet, weil es versucht, an eine zufällige Speicheradresse zu schreiben.
Formatierungsflags
„scanf“ verwendet dieselben Konvertierungsspezifizierer wie „printf“. Wer das eine kennt, kennt auch das andere. Aber der Kontext ist wichtig.
- Ganzzahlen : „%d“.
- Gleitkommazahlen :
%f - Einzelzeichen :
%c - Strings :
%s
Halten Sie sie gerade. Tauschen Sie „%f“ gegen eine Ganzzahl aus, erhalten Sie fehlerhafte Daten oder einen Absturz.
Warum scanf nicht ausreicht
Sie können „scanf“-Aufrufe verketten, um mehrere Werte zu lesen.
„c
scanf(“%d”, &a);
scanf(“%d”, &b);
„
Das funktioniert für Zahlen. Es ist sauber genug. Aber versuchen Sie, eine ganze Textzeile zu lesen? Es bricht. „scanf“ mit „%s“ stoppt beim ersten Leerzeichen. Es wird nicht die ganze Zeile gelesen. Und Pufferüberläufe werden nicht sicher behandelt.
Bei echten Programmen sollten Sie „scanf“ zur Texteingabe vermeiden. Verwenden Sie stattdessen „gets“ (was veraltet und gefährlich ist) oder vorzugsweise „fgets“. Diese Funktionen lesen jeweils eine Zeile in einen Puffer. Sobald Sie die Zeile haben, können Sie sie analysieren. Sie können nach Fehlern suchen. Sie können überprüfen, ob die Eingabe wie eine Zahl aussieht, bevor Sie versuchen, sie zu konvertieren. „scanf“ überspringt diesen Schritt. Es setzt voraus, dass Sie wissen, was Sie tun. Normalerweise ist das nicht der Fall.
Dinge mit Absicht kaputt machen
Der beste Weg, C zu lernen, ist nicht das Lesen der Dokumentation. Es liegt daran, dass der Compiler kaputt geht.
Nehmen Sie diesen Ausschnitt:
„c
int main() {
int a, b, c;
printf(“Geben Sie den ersten Wert ein:”);
scanf(“%d”, &a);
printf(“Geben Sie den zweiten Wert ein:”);
scanf(“%d”, &b);
c = a + b;
printf(“%d + %d = %d\n”, a, b, c);
0 zurückgeben;
}
„
Ändern Sie es. Mach es noch schlimmer.
Löschen Sie „b“ aus der Variablendeklaration. Beobachten Sie, wie der Compiler über eine undefinierte Variable schreit.
Löschen Sie ein Semikolon. Sehen Sie, wie sich der Syntaxfehler ausbreitet.
Entfernen Sie eine Zahnspange. Beobachten Sie, wie der Parser den Verstand verliert.
Löschen Sie eine Klammer. Beobachten Sie die Verwirrung


































