So lesen Sie Benutzereingaben in C mit scanf

3

Konstanten sind praktisch. Sie sind statisch. Aber sie sind auch langweilig.

Ein Programm, das immer 5 und 7 addiert, macht genau eines. Es passt sich nicht an. Es interagiert nicht. Um C-Code für Endbenutzer tatsächlich nützlich zu machen, müssen Sie mit der Hardcodierung von Werten aufhören und mit dem Abhören beginnen.

Das Tool für diesen Job ist „scanf“.

Von hartcodiert zu dynamisch

Im vorherigen Beispiel wurden die Variablen „a“ und „b“ wahrscheinlich mit festen Zahlen initialisiert. Die Logik war starr. Die Ausgabe war vorhersehbar. Wenn Sie den Zusatz ändern wollten, mussten Sie den Quellcode bearbeiten, neu kompilieren und erneut ausführen.

Das ist nicht benutzerfreundlich.

Um dies zu beheben, müssen wir Eingaben von der Konsole erfassen. Die Standardbibliothek „“ verarbeitet sowohl die Ausgabe („printf“) als auch die Eingabe („scanf“). Der Wechsel von Konstanten zu benutzerdefinierten Werten verwandelt das Programm von einer Taschenrechner-Demo in ein einfaches Dienstprogramm.

Die scanf-Syntax

Hier ist der Code, der es möglich macht:

„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;
}

Die Logik ist einfach. Es ist linear.

  1. Das Programm fordert zur Eingabe der ersten Ganzzahl auf.
  2. „scanf“ wartet auf Eingabe.
  3. Der Benutzer gibt eine Zahl ein und drückt die Eingabetaste.
  4. Der Wert wird in „a“ gespeichert.
  5. Wiederholen Sie den Vorgang für „b“.
  6. Fügen Sie sie hinzu.
  7. Drucken Sie das Ergebnis aus.

Die kaufmännische Und-Verwirrung (&).

Die häufigste Fehlerquelle für Anfänger ist hier das „&“-Symbol.

Schauen Sie sich diese Zeile an:
scanf("%d", &a);

Warum gibt es ein kaufmännisches Und? Warum nicht einfach „scanf(“%d”, a);“

Variablen in C sind nicht nur Namen. Es handelt sich um Speicheradressen. Wenn Sie „int a“ deklarieren, reservieren Sie einen Teil des RAM. „scanf“ möchte den Wert von „a“ nicht, da „a“ derzeit leer ist (oder Müll enthält). „scanf“ benötigt die Adresse, an die es den neuen Wert schreiben kann.

Das „&“ ist der „Adresse von“-Operator. Es gibt „scanf“ den Speicherort im Speicher, sodass es „a“ direkt ändern kann. Ohne diese Angabe verweisen Sie „scanf“ auf einen zufälligen Speicherbereich. Das Programm wird wahrscheinlich abstürzen oder, schlimmer noch, Ihre Daten beschädigen.

Wichtige Erkenntnis: „printf“ verwendet den Wert. „scanf“ benötigt die Adresse.

Formatbezeichner

Sie haben „%d“ in „printf“ verwendet, um eine Ganzzahl anzuzeigen. Sie müssen „%d“ in „scanf“ verwenden, um einen zu lesen.

Eine Nichtübereinstimmung dieser Werte führt zu undefiniertem Verhalten. Wenn Sie versuchen, eine Ganzzahl mit „%f“ (float) zu lesen, werden die Daten falsch interpretiert. Das Speicherlayout eines Floats unterscheidet sich von einem Integer. „scanf“ schreibt die Rohbits eines Floats

Wie scanf und printf mit Variablen in C umgehen

Beim Kompilieren und Ausführen des Codes trifft Theorie auf Realität. Wenn Sie diesen Schritt überspringen, raten Sie nur. Die Funktion „scanf“ funktioniert in Bezug auf Formatzeichenfolgen ähnlich wie „printf“, stellt jedoch strengere Eingabeanforderungen. Sie müssen den Adressoperator („&“) vor Variablen vom Typ „char“, „int“, „float“ und Strukturen platzieren. Ohne sie stürzt das Programm ab.

Warum scanf den Adressoperator benötigt

Das kaufmännische Und ist nicht optional. Es weist den Compiler an, die Eingabe direkt im Speicherort der Variablen zu speichern. Wenn Sie es weglassen, lösen Sie einen Laufzeitfehler aus. Sie sollten versuchen, es absichtlich zu entfernen. Den Absturz zu sehen ist lehrreicher als darüber zu lesen. Es zeigt genau, wie fragil C sein kann, wenn Speicheradressen falsch verwaltet werden.

Wie printf die Ausgabe für Benutzer formatiert

„printf“ sendet Text an die Standardausgabe. Die einfachste Variante sieht so aus:

„c
printf(“Hallo”);

Dies gibt das Wort „Hallo“ ohne Zeilenumbruch aus. Vergleichen Sie das mit:

„c
printf(“Hallo\n”);

Das „\n“ fügt einen Wagenrücklauf hinzu. Es beendet die Zeile. Ohne diese Angabe erscheint die nächste Ausgabe in derselben Zeile. Es ist ein kleines Detail, das die Lesbarkeit beeinträchtigt, wenn es ignoriert wird.

So betten Sie Variablen in printf-Strings ein

Um den Wert einer Variablen auszugeben, verwenden Sie einen Platzhalter. Der Operator „%d“ ersetzt sich selbst durch den ganzzahligen Wert der Variablen. Betrachten Sie dieses Beispiel:

„c
printf(“%d”, b);

Sie können separate „printf“-Aufrufe verketten, um Text und Variablen zu mischen, aber das ist ineffizient:

„c
printf(“Die Temperatur ist”);
printf(“%d”, b);
printf(” Grad\n”);

Der sauberere Ansatz bettet den Platzhalter in die Zeichenfolge ein:

„c
printf(“Die Temperatur beträgt %d Grad\n”, b);

Es funktionieren auch mehrere Platzhalter:

„c
printf(“%d + %d = %d\n”, a, b, c);

Die Anzahl der Platzhalter muss genau mit der Anzahl der Variablen übereinstimmen. Auch die Typen müssen übereinstimmen. Drei „%d“-Spezifizierer erfordern drei „int“-Parameter in derselben Reihenfolge. Nicht übereinstimmende Typen oder Zählungen führen zu undefiniertem Verhalten.

Welche Platzhalter verschiedene C-Typen behandeln

„printf“ unterstützt Standard-C-Typen durch spezifische Formatspezifizierer:

  • int verwendet „%d“.
  • float verwendet „%f“.
  • char verwendet „%c“.
  • Zeichenketten verwenden „%s“.

Eine ausführliche Dokumentation finden Sie, indem Sie auf einem UNIX-Rechner „man 3 printf“ eingeben. Andere Compiler stellen ähnliche Handbuchseiten oder Hilfedateien bereit.

Häufige C-Fehler, die Sie vermeiden sollten

Die Groß-/Kleinschreibung ist streng. „Printf“ oder „PRINTF“ schlägt fehl. Es muss ein Kleinbuchstabe „printf“ sein.

  • Das Vergessen des „&“ in „scanf“ führt zu Laufzeitabstürzen.
    – Nicht übereinstimmende Parameteranzahlen in „printf“ oder „scanf“ beeinträchtigen die Ausgabe.
  • Die Verwendung nicht deklarierter Variablen führt zu Kompilierungsfehlern.

Um diese Probleme zu beheben, muss zunächst die Syntax überprüft werden. Der Compiler wird Ihnen normalerweise genau sagen, wo die Nichtübereinstimmung liegt. Sie müssen nur die Fehlermeldung lesen.