2024 Autor: Howard Calhoun | [email protected]. Zuletzt bearbeitet: 2024-01-17 18:45
In diesem Artikel wird die Funktion scanf() in allgemeiner Form ohne Bezugnahme auf einen bestimmten Standard betrachtet, daher sind hier Daten aus allen C99-, C11-, C++11-, C++14-Standards enth alten. Vielleicht funktioniert die Funktion in einigen Standards mit Unterschieden zu dem im Artikel vorgestellten Material.
scanf C-Funktion - Beschreibung
scanf() ist eine Funktion, die sich in den Header-Dateien stdio.h(C) und cstdio(C++) befindet und auch als formatierte Programmeingabe bekannt ist. scanf liest Zeichen aus dem Standard-Eingabestrom (stdin) und konvertiert sie entsprechend dem Format und schreibt sie dann in die angegebenen Variablen. Format - bedeutet, dass die Daten beim Empfang in eine bestimmte Form umgewandelt werden. So wird die Funktion scanf C beschrieben:
scanf("%format", &variable1[, &variable2, […]), wobei Variablen als Adressen übergeben werden. Der Grund für diese Art der Übergabe von Variablen an eine Funktion liegt auf der Hand: Als Ergebnis der Arbeit gibt sie einen Wert zurück, der das Vorhandensein von Fehlern anzeigt, soDie einzige Möglichkeit, die Werte von Variablen zu ändern, besteht darin, die Adresse zu übergeben. Dank dieser Methode kann die Funktion auch Daten jeglicher Art verarbeiten.
Einige Programmierer bezeichnen Funktionen wie scanf() oder printf() wegen der Analogie zu anderen Sprachen als Prozeduren.
Scanf ermöglicht die Eingabe aller grundlegenden Sprachtypen: char, int, float, string, etc. Bei Variablen vom Typ String muss das Adresszeichen "&" nicht angegeben werden, da die Variable vom Typ String ein Array ist und ihr Name die Adresse des ersten Elements des Arrays im Speicher des Computers ist.
Dateneingabeformat oder Kontrollstring
Schauen Sie sich zunächst das C-Funktionsbeispiel scanf aus der Beschreibung an.
include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); 0 zurückgeben; //Anforderung für Linux-Systeme }
Das Eingabeformat besteht aus den folgenden vier Parametern: %[width][modifiers] type. In diesem Fall sind das „%“-Zeichen und der Typ Pflichtparameter. Das heißt, das Mindestformat sieht so aus: „%s“, „%d“und so weiter.
Im Allgemeinen werden die Zeichen, aus denen der Formatstring besteht, unterteilt in:
- Formatbezeichner - alles, was mit %; beginnt
- Trenn- oder Leerzeichen - das sind Leerzeichen, Tabulatoren (t), Zeilenumbrüche (n);
- andere Zeichen als Leerzeichen.
Funktion möglicherweise nicht sicher.
Verwende scanf_s() anstelle von scanf().
(Nachricht von Visual Studio)
Typ- oder Formatbezeichner oder Konvertierungszeichen oder Steuerzeichen
Eine scanf-C-Deklaration muss mindestens einen Formatbezeichner enth alten, der am Ende von Ausdrücken angegeben wird, die mit "%" beginnen. Es teilt dem Programm mit, welche Art von Daten bei der Eingabe zu erwarten sind, normalerweise über die Tastatur. Liste aller Formatbezeichner in der folgenden Tabelle.
Typ | Bedeutung | |
1 | %c |
Das Programm wartet auf eine Zeicheneingabe. Die zu schreibende Variable muss vom Zeichentyp char. sein |
2 | %d | Das Programm erwartet die Eingabe einer Dezimalzahl vom Typ Integer. Die Variable muss vom Typ int. sein |
3 | %i | Das Programm erwartet die Eingabe einer Dezimalzahl vom Typ Integer. Die Variable muss vom Typ int. sein |
4 | %e, %E | Das Programm erwartet die Eingabe einer Gleitkommazahl (Komma) in Exponentialform. Die Variable muss vom Typ Float sein. |
5 | %f | Das Programm erwartet eine Fließkommazahl (Komma). Die Variable muss vom Typ Float sein. |
6 | %g, %G | Das Programm erwartet eine Fließkommazahl (Komma). Die Variable muss vom Typ Float sein. |
7 | %a | Das Programm erwartet eine Fließkommazahl (Komma). Die Variable muss vom Typ Float sein. |
8 | %o | Das Programm erwartet eine Oktalzahl. Die Variable muss vom Typ int. sein |
9 | %s | Das Programm wartet auf die Eingabe einer Zeichenkette. Eine Zeichenfolge ist ein Satz beliebiger Zeichen bis zum ersten gefundenen Trennzeichen. Die Variable muss vom Typ String sein. |
10 | %x, %X | Das Programm wartet auf eine Hexadezimalzahl. Die Variable muss vom Typ int. sein |
11 | %p | Variable erwartet Zeigereingabe. Die Variable muss vom Typ Zeiger sein. |
12 | %n | Schreibt einen ganzzahligen Wert in eine Variable, der gleich der Anzahl der Zeichen ist, die bisher von der scanf-Funktion gelesen wurden. |
13 | %u |
Das Programm liest eine ganze Zahl ohne Vorzeichen. Der Variablentyp muss eine ganze Zahl ohne Vorzeichen sein. |
14 | %b | Das Programm wartet auf eine Binärzahl. Die Variable muss vom Typ int. sein |
15 | % | Gescannter Zeichensatz. Das Programm wartet auf die Eingabe von Zeichen.aus dem in eckigen Klammern angegebenen begrenzten Pool. scanf funktioniert, solange Zeichen aus dem angegebenen Satz im Eingabestream vorhanden sind. |
16 | %% | Zeichen "%". |
Zeichen im Formatstring
Sternsymbol ()
Das Sternchen () ist ein Flag, das anzeigt, dass die Zuweisungsoperation unterdrückt werden soll. Unmittelbar nach dem „%“-Zeichen steht ein Sternchen. Beispiel:
scanf("%d%c%d", &x, &y); //Zeichen zwischen zwei Ganzzahlen ignorieren. scanf("%s%d%s", str, str2); //Integer zwischen zwei Strings ignorieren.
Das heißt, wenn Sie in der Konsole die Zeile "45-20" eingeben, macht das Programm folgendes:
- Variable "x" wird der Wert 45 zugewiesen.
- Variable "y" wird der Wert 20 zugewiesen.
- Und das Minuszeichen (Bindestrich) "-" wird dank "%c" ignoriert.
Breite (oder Feldbreite)
Dies ist eine Ganzzahl zwischen dem "%"-Zeichen und dem Formatbezeichner, der die maximale Anzahl von Zeichen angibt, die beim aktuellen Lesevorgang gelesen werden sollen.
scanf("%20s", str); //die ersten 20 Zeichen aus dem Eingabestrom lesen
Es gibt ein paar wichtige Dinge zu beachten:
- scanf wird beendet, wenn es auf ein Trennzeichen stößt, auch wenn es keine 20 Zeichen gezählt hat.
- Wenn mehr als 20 Zeichen eingegeben werden, werden nur die ersten 20 Zeichen in str geschrieben.
ModifikatorenTyp (oder Genauigkeit)
Dies sind spezielle Flags, die den für die Eingabe erwarteten Datentyp modifizieren. Das Flag wird links vom Typbezeichner angegeben:
- L oder l (kleines L) Wenn "l" mit den Bezeichnern d, i, o, u, x verwendet wird, teilt das Flag dem Programm mit, dass eine lange int-Eingabe erwartet wird. Wenn "l" mit dem e- oder f-Bezeichner verwendet wird, teilt das Flag dem Programm mit, dass es einen doppelten Wert erwarten soll. Die Verwendung von "L" teilt dem Programm mit, dass ein langer Double erwartet wird. Die Verwendung von „l“mit den Spezifizierern „c“und „s“teilt dem Programm mit, dass Zwei-Byte-Zeichen wie wchar_t erwartet werden. Zum Beispiel "%lc", "%ls", "%l[asd]".
- h ist ein Flag, das den kurzen Typ angibt.
- hh - gibt an, dass die Variable ein Zeiger auf einen Zeichenwert mit oder ohne Vorzeichen ist. Das Flag kann mit den Bezeichnern d, i, o, u, x, n verwendet werden.
- ll (zwei kleine L's) - gibt an, dass die Variable ein Zeiger auf einen Wert vom Typ signed long long int oder unsigned long long int ist. Das Flag wird mit Bezeichnern verwendet: d, i, o, u, x, n.
- j - gibt an, dass die Variable ein Zeiger auf den Typ intmax_t oder uintmax_t aus der Header-Datei stdint.h ist. Verwendet mit Spezifizierern: d, i, o, u, x, n.
- z - gibt an, dass die Variable ein Zeiger auf den Typ size_t ist, dessen Definition sich in stddef.h befindet. Verwendet mit Spezifizierern: d, i, o, u, x, n.
- t - gibt an, dass die Variable ein Zeiger auf den Typ ptrdiff_t ist. Definition andieser Typ ist in stddef.h. Verwendet mit Spezifizierern: d, i, o, u, x, n.
Anschaulicher kann das Bild mit Modifikatoren als Tabelle dargestellt werden. Eine solche Beschreibung von scanf C für Programmierer wird klarer.
Andere Zeichen
Alle im Format vorkommenden Zeichen werden verworfen. Gleichzeitig ist zu beachten, dass das Vorhandensein von Whitespace oder Trennzeichen (Zeilenumbruch, Leerzeichen, Tabulator) im Steuerstring zu unterschiedlichem Verh alten der Funktion führen kann. In einer Version liest scanf(), ohne eine Anzahl von Trennzeichen zu speichern, bis es auf ein anderes Zeichen als das Trennzeichen stößt, und in einer anderen Version spielen Leerzeichen (nur sie) keine Rolle und der Ausdruck "%d + %d" entspricht "% d+%d".
Beispiele
Sehen wir uns einige Beispiele an, um Ihnen beim Nachdenken zu helfen und besser zu verstehen, wie die Funktion funktioniert.
scanf("%3s", str); //Wenn Sie in der Konsole den String "1d2s3d1;3" eingeben, wird nur "1d2" nach str geschrieben scanf("%dminus%d", &x, &y); //Minuszeichen zwischen zwei Zahlen werden verworfen scanf("%5[0-9]", str); // Zeichen werden in str eingegeben, bis 5 Zeichen vorhanden sind und die Zeichen Zahlen von 0 bis 9 sind. scanf("%lf", &d); //doppelte Eingabe erwarten scanf("%hd", &x); //erwartete Nummer vom Typ short scanf("%hu", &y); //vorzeichenlose Zahl erwarten short scanf("lx", &z); //erwartete Anzahl vom Typ long int
VonDie folgenden Beispiele zeigen, wie sich die erwartete Zahl mit verschiedenen Symbolen ändert.
scanf C - Beschreibung für Anfänger
Dieser Abschnitt ist für Anfänger nützlich. Oft müssen Sie nicht so sehr eine vollständige Beschreibung von scanf C zur Hand haben, sondern die Details, wie die Funktion funktioniert.
- Diese Funktion ist etwas ver altet. Es gibt mehrere unterschiedliche Implementierungen in Bibliotheken verschiedener Versionen. Zum Beispiel die verbesserte Funktion scanf S C, deren Beschreibung auf der Microsoft-Website zu finden ist.
- Die Anzahl der Spezifizierer im Format muss mit der Anzahl der an die Funktion übergebenen Argumente übereinstimmen.
- Elemente des Eingabestroms dürfen nur durch Trennzeichen getrennt werden: Leerzeichen, Tabulator, neue Zeile. Komma, Semikolon, Punkt usw. - diese Zeichen sind keine Trennzeichen für die Funktion scanf().
- Trifft scanf auf ein Trennzeichen, wird die Eingabe gestoppt. Wenn mehr als eine Variable zu lesen ist, fährt scanf mit dem Lesen der nächsten Variable fort.
- Die kleinste Inkonsistenz im Eingabedatenformat führt zu unvorhersehbaren Ergebnissen des Programms. Nun, wenn das Programm einfach mit einem Fehler endet. Aber oft arbeitet das Programm weiter und macht es falsch.
- scanf("%20s …", …); Wenn der Eingabestrom 20 Zeichen überschreitet, liest scanf die ersten 20 Zeichen und bricht entweder ab oder fährt mit dem Lesen der nächsten Variablen fort, sofern eine angegeben ist. In diesem Fall fährt der nächste Aufruf von scanf mit dem Lesen des Eingabestreams ab dem Punkt fort, an dem die Arbeit des vorherigen Aufrufs von scanf aufgehört hat. Wenn beim Lesen der ersten 20Zeichen, wird ein Trennzeichen gefunden, scanf bricht ab oder fährt mit dem Lesen der nächsten Variablen fort, auch wenn es nicht 20 Zeichen für die erste Variable gelesen hat. In diesem Fall werden alle ungelesenen Zeichen an die nächste Variable angehängt.
- Wenn die Menge der gescannten Zeichen mit einem "^" beginnt, liest scanf die Daten, bis es auf ein Trennzeichen oder ein Zeichen aus der Menge trifft. Beispiel: „%[^A-E1-5]“liest Daten aus dem Stream, bis eines der englischen Großbuchstaben von A bis E oder eine der Zahlen von 1 bis 5 gefunden wird.
- Die C-Funktion scanf gibt, wie beschrieben, eine Zahl zurück, die der Anzahl erfolgreicher Schreibvorgänge in Variablen entspricht. Wenn scanf 3 Variablen schreibt, dann gibt das Erfolgsergebnis der Funktion die Zahl 3 zurück. Wenn scanf keine Variablen schreiben konnte, dann ist das Ergebnis 0. Und schließlich, wenn scanf aus irgendeinem Grund überhaupt nicht starten konnte, die Ergebnis ist EOF.
- Wenn die Funktion scanf() falsch beendet wurde. Beispiel: scanf("%d", &x) - es wurde eine Zahl erwartet, aber Zeichen wurden als Eingabe empfangen. Der nächste Aufruf von scanf() beginnt an der Stelle im Eingabestream, an der der vorherige Funktionsaufruf endete. Um dieses Problem zu überwinden, ist es notwendig, die problematischen Zeichen loszuwerden. Dies kann beispielsweise durch den Aufruf von scanf("%s") erfolgen. Das heißt, die Funktion liest eine Zeichenkette und verwirft sie. Auf diese knifflige Weise können Sie die notwendigen Daten weiter eingeben.
- In einigen Implementierungen von scanf() ist "-" im gescannten Zeichensatz nicht erlaubt.
- Der Spezifizierer "%c" liest jedes Zeichen aus dem Stream. Das heißt, es liest auch das Trennzeichen. Um das Trennzeichen zu überspringen und das gewünschte Zeichen weiterzulesen, können Sie "%1s" verwenden.
- Bei Verwendung des "c"-Spezifizierers ist es zulässig, die Breite "%10c" zu verwenden, aber dann muss ein Array von Elementen vom Typ char als Variable an die scanf-Funktion übergeben werden.
- „%[a-z]“bedeutet „alle Kleinbuchstaben des englischen Alphabets“und „%[z-a]“bedeutet nur 3 Zeichen: ‚z‘, ‚a‘, ‚-‘. Mit anderen Worten bedeutet das Zeichen "-" nur dann einen Bereich, wenn es zwischen zwei Zeichen in der richtigen Reihenfolge liegt. Wenn "-" am Ende eines Ausdrucks, am Anfang oder in der falschen Reihenfolge der Zeichen auf beiden Seiten davon steht, dann ist es nur ein Bindestrich, kein Bereich.
Schlussfolgerung
Damit ist die Beschreibung von scanf C abgeschlossen. Dies ist ein nettes praktisches Feature für die Arbeit in kleinen Programmen und bei der Verwendung der prozeduralen Programmiermethode. Der Hauptnachteil ist jedoch die Anzahl unvorhersehbarer Fehler, die bei der Verwendung von scanf auftreten können. Daher behält man sich die Beschreibung von scanf C beim Programmieren am besten vor Augen. In großen professionellen Projekten werden iostreams verwendet, da sie über höhere Fähigkeiten verfügen, besser in der Lage sind, Fehler zu erkennen und zu behandeln und auch mit erheblichen Informationsmengen zu arbeiten. Es sollte auch beachtet werden, dass die Beschreibung von scanf C in russischer Sprache sowie Beispiele dafür in vielen Netzwerkquellen verfügbar sindverwenden, aufgrund des Alters der Funktion. Daher finden Sie die Antwort bei Bedarf immer in den thematischen Foren.