Grundlagen der formatierten Eingabe / Ausgabe in C Concepts I / O wird im Wesentlichen ein Zeichen (oder Byte) zu einem Zeitstrahl durchgeführt - eine Folge von Zeichen, die von einem Ort zu einem anderen Eingangsstrom fließen. Daten fließt vom Eingabegerät (Tastatur, Datei, etc.) in den Speicherausgabestrom. Datenflüsse vom Speicher zum Ausgabegerät (Monitor, Datei, Drucker usw.) Standard-I / O-Ströme (mit eingebauter Bedeutung) stdin. Standard-Eingabe-Stream (Standardeinstellung ist Tastatur) stdout. Standard-Ausgabe-Stream (Standardwerte zu überwachen) stderr. Standardfehlerstrom stdio. h - enthält grundlegende I / O-Funktionen scanf. Liest von Standard-Eingabe (stdin) printf. Schreibt auf die Standardausgabe (stdout) Es gibt noch andere Funktionen, die printf und scanf ähnlich sind, die auf andere Ströme schreiben und diese lesen können. C / C-Compiler Formatierte E / A - bezieht sich auf die Umwandlung von Daten in einen Stream Von Zeichen, für das Drucken (oder das Lesen) im Klartextformat Alle Text-I / O, die wir tun, gilt als formatierte E / A Die andere Möglichkeit ist das Lesen / Schreiben direkter binärer Informationen (zB bei Datei-E / A) Ausgabe mit printf Recap Das grundlegende Format eines printf-Funktionsaufrufs ist: where: formatstring ist das Layout dessen, was gedruckt wird listofexpressions ist eine durch Kommas getrennte Liste von Variablen oder Ausdrücken, die Ergebnisse liefern, die in die Ausgabe eingefügt werden sollen Printf Der String selbst Conversion Specifiers Ein Conversion-Spezifizierer ist ein Symbol, das als Platzhalter in einem Formatierungsstring verwendet wird. Für den Integer-Ausgang (beispielsweise) ist d der Spezifizierer, der den Platz für Integer enthält. Hier sind einige häufig verwendete Konvertierungs-Spezifizierer (nicht eine umfassende Liste): Drucken von Ganzzahlen Um eine Ganzzahl auszugeben, verwenden Sie d in der Formatzeichenfolge und einen Integer-Ausdruck in der listofexpressions. Wir können das Feld wicth (d. h., wie viele Leerzeichen das Element in druckt) angeben. Standardmäßig rechtsbündig. Platzieren Sie eine Zahl zwischen dem und dem d. In diesem Beispiel beträgt die Feldbreite 10: Um nach links zu justieren, verwenden Sie eine negative Zahl in der Feldbreite: Wenn die Feldbreite zu klein oder nicht spezifiziert ist, wird standardmäßig die minimale Anzahl von Zeichen benötigt, die zum Drucken des Elements erforderlich sind: Angeben des Feldes Breite ist am nützlichsten beim Drucken mehrerer Ausgabezeilen, die in einem Tabellenformat dargestellt werden sollen. Fließkommazahlen drucken Verwenden Sie den f-Modifier, um Gleitpunktwerte in fester Schreibweise zu drucken: Verwenden Sie e für exponentielle Notation: Beachten Sie, dass das e02 mal bedeutet 10 zur 2. Potenz Sie können auch die Dezimalpräzision steuern, also die Anzahl der Stellen nach der Dezimalzahl. Die Ausgabe wird bei Bedarf auf die entsprechende Anzahl von Dezimalstellen gerundet: Feldbreite kann auch wie bei Ganzzahlen gesteuert werden: Im Konvertierungsspezifizierer ist die Zahl vor der Dezimalzahl die Feldbreite und die Nummer nach der Präzision. (In diesem Beispiel 9 und 2). -9.2 würde linksbündig in einer Feldbreite von 9 liegen, wie bei ganzen Zahlen. Zeichen und Zeichenfolgen drucken Verwenden Sie den Formatierungsbezeichner c für Zeichen. Standard-Feldgröße ist 1 Zeichen: Verwenden Sie s für Druckzeichenfolgen. Feldbreiten funktionieren wie bei ganzen Zahlen: output. c - enthält alle obigen Sample-Ausgänge. Probieren Sie es selbst aus scanf Grundlagen Um Daten aus der Standard-Eingabe (Tastatur) zu lesen, rufen wir die Funktion scanf auf. Die grundlegende Form eines Aufrufs von scanf ist: Der Formatstring ist ähnlich dem von printf. Aber anstelle von Ausdrücken brauchen wir Platz zum Speichern eingehender Daten, daher die Liste der Variablenadressen Wenn x eine Variable ist, dann bedeutet der Ausdruck x die Adresse von X scanf Beispiel: Conversion Specifiers Meistens das gleiche wie für die Ausgabe. Einige kleine Unterschiede Verwenden Sie f für Typ float. Aber verwenden Sie lf für die Typen double und long double Der Datentyp read, der Konvertierungsspezifizierer und die verwendete Variable müssen in type passen Leerzeichen wird standardmäßig in fortlaufenden numerischen Lesungen übersprungen. Aber es ist nicht für Zeichen / String-Eingänge übersprungen. Beispiel Beispielablauf 1 Benutzereingabe unterstrichen, um sie von der Programmausgabe zu unterscheiden. Beispielablauf 2 Beachten Sie, dass in diesem Beispiellauf das Zeichen, das gelesen wurde, NICHT der Buchstabe N war. Es war das Feld. (Denken Sie daran, Leerraum nicht übersprungen auf Zeichen liest). Dies kann berücksichtigt werden. Betrachten Sie, wenn die scanf Linie so aussah: Theres ein Raum zwischen dem f und dem c in der Formatzeichenkette. Dies ermöglicht dem Benutzer, ein Leerzeichen einzugeben. Angenommen, es handelt sich um die eingegebene Eingabe: Dann enthält die Zeichenvariable c nun das N. input2.c - eine Version des Beispiels mit dieser Verknüpfung wird hier verknüpft Interaktive Eingabe Sie können die Eingabe interaktiver machen, indem Sie den Benutzer sorgfältiger auffordern. Dies kann an einigen Stellen langweilig sein, aber in vielen Fällen macht es Programme benutzerfreundlicher. Beispiel: Ein guter Weg, um mehr über scanf zu lernen, ist, verschiedene Eingaben in verschiedenen Kombinationen auszuprobieren und in Testfälle einzugeben - sehen Sie, was passiert printf / scanf mit C-Strings Eine ganze C-Zeichenfolge kann einfach gedruckt werden S-Formatierungssymbol zusammen mit dem Namen des char-Arrays, das den String speichert (als Argument, das diese Position füllt): Seien Sie vorsichtig, nur dies auf char-Arrays zu verwenden, die als C-Strings verwendet werden. (Dies bedeutet, nur wenn das Nullzeichen als Terminator vorhanden ist). Ebenso können Sie einen String in ein char-Array mit scanf lesen. Der folgende Aufruf erlaubt die Eingabe eines Wortes (bis zu 19 Zeichen und ein abschließendes Nullzeichen) von der Tastatur, die im Array word1 gespeichert ist: Zeichen werden von der Tastatur gelesen, bis der erste Leerraum (Leerzeichen, Tabulator, Zeichen angetroffen wird. Die Eingabe wird im Zeichenarray gespeichert und das Nullzeichen wird automatisch angehängt. Beachten Sie auch, dass das im Scan-Aufruf nicht benötigt wurde (anstelle von word1 wurde Word1 verwendet). Dies liegt daran, dass der Name des Arrays selbst (ohne Index) tatsächlich eine Variable ist, die eine Adresse (einen Zeiger) speichert. sprintf sprintf Gibt einen String zurück, der durch die üblichen printf-Konventionen der C-Bibliothek-Funktion sprintf formatiert ist. Siehe unten für weitere Details und siehe Sprintf (3) oder printf (3) auf Ihrem System für eine Erläuterung der allgemeinen Grundsätze. Perl hat seine eigene Sprintf-Formatierung: emuliert die C-Funktion sprintf (3). Aber nicht verwenden, außer für Gleitkommazahlen, und selbst dann nur Standard-Modifikatoren sind erlaubt. Nicht standardmäßige Erweiterungen in Ihrem lokalen sprintf (3) sind daher von Perl nicht verfügbar. Im Gegensatz zu printf. Sprintf nicht, was Sie wahrscheinlich bedeuten, wenn Sie es ein Array als Ihr erstes Argument. Das Array wird skalaren Kontext gegeben, und anstatt das 0. Element des Arrays als das Format zu verwenden, verwendet Perl die Anzahl der Elemente im Array als Format, was fast nie nützlich ist. Perls sprintf erlaubt die folgenden allgemein bekannten Konvertierungen: Zusätzlich erlaubt Perl die folgenden weit verbreiteten Conversions: Schließlich erlaubt Perl für die Rückwärtskompatibilität (und wir bedeutet Rückwärtskompatibilität) diese unnötigen, aber weit gestützten Conversions: Beachten Sie, dass die Anzahl von Exponentenziffern in der wissenschaftlichen Notation, die von e. E. g und G für Zahlen mit dem Modul des Exponenten von weniger als 100 ist systemabhängig: er kann drei oder weniger sein (bei Bedarf Nullgepolstert). Mit anderen Worten, 1,23 mal zehn bis 99 kann entweder 1,23e99 oder 1,23e099 sein. Ähnlich können für a und A. der Exponent oder die hexadezimalen Ziffern schwimmen: vor allem die lange Perl-Konfigurationsoption kann zu Überraschungen führen. Zwischen dem und dem Formatbuchstaben können Sie mehrere zusätzliche Attribute festlegen, die die Interpretation des Formats steuern. In der Reihenfolge sind dies: Ein expliziter Formatparameterindex, wie z. B. 2. Standardmäßig formatiert sprintf das nächste unbenutzte Argument in der Liste, aber dies erlaubt es, die Argumente außer Reihenfolge zu nehmen: Wenn ein Leerzeichen und ein Pluszeichen angegeben sind Wie die Flags auf einmal, wird der Raum ignoriert. Wenn das Flag und eine Präzision in der o-Umwandlung gegeben sind, wird die Genauigkeit erhöht, wenn sie für die führende 0 erforderlich ist. Dieses Flag teilt Perl mit, dass die zugeführte Zeichenfolge als Vektor von Ganzzahlen interpretiert wird, eine für jedes Zeichen in der Zeichenkette. Perl wendet das Format nacheinander auf jede ganze Zahl an und verbindet dann die resultierenden Strings mit einem Trennzeichen (standardmäßig ein Punkt). Dies kann nützlich sein, um Ordinalwerte von Zeichen in beliebigen Zeichenfolgen anzuzeigen: Setzen Sie ein Sternchen vor dem v, um die Zeichenfolge zu überschreiben, die verwendet werden soll, um die Zahlen zu trennen: Sie können auch explizit die Argumentnummer angeben, die für die Join-Zeichenfolge mit etwas wie 2v verwendet wird Beispiel: Argumente werden üblicherweise so formatiert, dass sie nur so breit sind, wie es erforderlich ist, um den gegebenen Wert anzuzeigen. Sie können die Breite überschreiben, indem Sie hier eine Zahl setzen oder die Breite aus dem nächsten Argument (mit) oder aus einem angegebenen Argument (zB mit 2) erhalten: Wenn eine erhaltene Feldbreite negativ ist, hat sie die gleiche Wirkung wie die - Flagge: linksbündig. Sie können eine Genauigkeit (für numerische Konvertierungen) oder eine maximale Breite (für Zeichenfolgenkonvertierungen) angeben, indem Sie einen Wert angeben. Gefolgt von einer Zahl. Für Gleitkomma-Formate außer g und G. Dies gibt an, wie viele Stellen rechts des zu zeigenden Dezimalpunkts liegen (die Voreinstellung ist 6). Zum Beispiel: Für g und G gibt dies die maximale Anzahl der anzuzeigenden Ziffern an, einschließlich der vor dem Dezimaltrennzeichen und jene nach dem folgenden: Für Ganzzahl-Konvertierungen bedeutet das Angeben einer Genauigkeit, dass die Ausgabe der Zahl selbst Null sein sollte , Wobei die 0-Markierung ignoriert wird: Bei String-Conversions trennt die Angabe einer Präzision den String auf die angegebene Breite: Sie können auch die Genauigkeit aus dem nächsten Argument mit .. oder aus einem angegebenen Argument (zB mit .2): Wenn eine erhaltene Präzision negativ ist, zählt sie überhaupt keine Präzision. Für numerische Konvertierungen können Sie die Größe festlegen, um die Zahl mit l zu interpretieren. h. V. q. L. oder ll. Für Integer-Konvertierungen (duox X bi DUO) werden Zahlen in der Regel angenommen, was die Standard-Ganzzahlgröße auf Ihrer Plattform (in der Regel 32 oder 64 Bits) ist, aber Sie können dies überschreiben, um stattdessen einen der Standard-C-Typen zu verwenden Durch den Compiler, der verwendet wird, um Perl zu erstellen: Ab 5.14 wirft keiner von diesen eine Ausnahme auf, wenn diese nicht auf Ihrer Plattform unterstützt werden. Wenn Warnungen jedoch aktiviert sind, wird eine Warnung der Druckf-Warnklasse auf einem nicht unterstützten Konvertierungsflag ausgegeben. Sollten Sie stattdessen eine Exception bevorzugen, gehen Sie wie folgt vor: Wenn Sie über eine Versionsabhängigkeit wissen möchten, bevor Sie das Programm starten, legen Sie so etwas wie oben: Sie können herausfinden, ob Ihr Perl Quads über Config unterstützt: Nummern werden in der Regel als Standard-Gleitkomma-Größe auf Ihrer Plattform (double oder long double) angenommen, aber Sie können lange double mit q erzwingen. L. oder ll, wenn Ihre Plattform sie unterstützt. Sie können herausfinden, ob Ihr Perl lange Verdoppelungen über Config unterstützt: Sie können herausfinden, ob Perl langes doppeltes betrachtet, um die Standardgleitkommawand zu sein, die auf Ihrer Plattform über Config verwendet wird: Es kann auch sein, dass lange Doppelte und doppelte die selben sind Sache: Der Größenspezifizierer V hat keine Auswirkung auf Perl-Code, wird aber für Kompatibilität mit XS-Code unterstützt. Es bedeutet, dass die Standardgröße für eine Perl-Ganzzahl oder Gleitkommazahl verwendet wird. Dies ist die Standardeinstellung. Normalerweise nimmt sprintf das nächste unbenutzte Argument als den zu formatierenden Wert für jede Formatspezifikation. Wenn in der Formatspezifikation zusätzliche Argumente erforderlich sind, werden diese aus der Argumentliste in der Reihenfolge verbraucht, in der sie in der Formspezifikation vor dem zu formatierenden Wert erscheinen. Wenn ein Argument durch einen expliziten Index angegeben wird, hat dies keine Auswirkungen auf die normale Reihenfolge der Argumente, auch wenn der explizit angegebene Index das nächste Argument gewesen wäre. Verwendet a für die Breite, b für die Präzision und c als den zu formatierenden Wert, während: a für die Breite und Präzision und b für den Formatierungswert verwendet wird. Hier sind einige Beispiele, die bei der Verwendung eines expliziten Indexes erforderlich sind, wenn es erforderlich ist, escaping auszuführen: Wenn use locale (einschließlich Gebietsschema 39: notcharacters39) in Kraft ist und POSIX :: setlocale aufgerufen wurde, wird das Zeichen für das Dezimaltrennzeichen verwendet Formatierten Gleitkommazahlen wird durch das LCNUMERIC-Gebietsschema beeinflusst. Siehe perllocale und POSIX. Der printf Befehl Stranger, das ist ein sehr großes Thema, das Erfahrung braucht - füllen Sie bitte fehlende Informationen aus, erweitern Sie die Beschreibungen und korrigieren Sie die Details, wenn Sie können Achtung: Dies ist über den Bash-builtin Befehl printf - jedoch , Sollte die Beschreibung für einen externen Befehl, der POSIX folgt, nahezu identisch sein. GNU Awk erwartet ein Komma nach dem Formatstring und zwischen jedem der Argumente eines printf-Befehls. Beispiele finden Sie unter: Code-Snippet. Im Gegensatz zu anderen Dokumentationen möchte ich Sie nicht auf die manuelle Seite für die printf () C-Funktionsfamilie umleiten. Allerdings, wenn you039re mehr erfahren, sollte das die detaillierteste Beschreibung für die Format-Strings und Modifikatoren sein. Aufgrund widersprüchlicher historischer Implementierungen des echo-Befehls empfiehlt POSIX, dass printf gegenüber echo bevorzugt wird. Allgemein Der Befehl printf bietet eine Methode zum Drucken von vorformatiertem Text ähnlich der printf () - Systemschnittstelle (C-Funktion). It039s als Nachfolger für Echo bedeutet und hat weit mehr Funktionen und Möglichkeiten. Neben anderen Gründen hat POSIX ein sehr gutes Argument, es zu empfehlen: Beide historischen Hauptaromen des Echobefehls sind gegenseitig exklusiv, sie kollidieren. Für die Lösung des Problems musste ein Befehl quotnewquot erfunden werden. Syntax Das Textformat wird in ltFORMATgt angegeben. Während alle Argumente, auf die das Formatstring verweisen kann, nachher gegeben werden, hier durch ltARGUMENTSgt angegeben. So sieht ein typischer printf - Aufruf folgendermaßen aus: wobei quaSame: snName: snquot die Formatspezifikation ist und die beiden Variablen als Argumente übergeben werden, zeigt das s im Formatstring auf (für jeden angegebenen Formatbezeichner erwartet printf ein Argument) . Optionen Wenn angegeben, wird die Ausgabe an die Variable VAR statt an Stdout ausgedruckt (vergleichbar mit sprintf () in irgendeiner Weise) Die Option - v Option kann direkt zu Array-Indizes in Bash-Versionen älter als Bash 4.1 zuweisen. In Versionen, die jünger als 4.1 sind, muss man bei der Ausführung von Erweiterungen in das erste nicht-optionale Argument von printf vorsichtig sein, da dies die Möglichkeit einer leichten Code-Injection-Schwachstelle eröffnet. Wo das Echo natürlich durch einen beliebigen Befehl ersetzt werden kann. Wenn Sie müssen, geben Sie entweder einen hartcodierten Formatstring an oder verwenden Sie -, um das Ende der Optionen zu signalisieren. Das genaue gleiche Thema gilt auch für lesen. Und eine ähnliche zu mapfile. Obwohl Ausführungen in ihre Argumente weniger häufig sind. Argumente Natürlich in der Shell-Bedeutung sind die Argumente nur Strings, aber die gemeinsamen C-Notationen sowie einige Ergänzungen für Nummernkonstanten werden erkannt, um ein Zahlenargument zu printf. printf und scanf Format Codes Nummer mit bis zu sechs Ziffern zu geben Präzision, wissenschaftliche Notation Fußnote: In printf () werden die Ausdrucksart Promotions erwartet - in einem Ausdruck werden char und short in int umgewandelt, und float wird in double konvertiert. Somit entspricht c tatsächlich einem Parameter vom Typ int und f und g entsprechen tatsächlich Parametern vom Typ double. Somit gibt es in printf () keinen Unterschied zwischen f und lf oder zwischen g und lg. Allerdings ist in scanf (), was übergeben wird, ein Zeiger auf die Variable, so dass keine Typ-Promotions auftreten oder erwartet werden. Also sind f und lf in scanf ziemlich verschieden, aber das gleiche in printf. Persönlich habe ich verwendet, um lg routinemäßig für doppelte in printf und scanf, aber dies ist aus der Gunst in diesen Tagen und in der Tat gcc wird Ihnen eine Warnmeldung für die Verwendung von lg in printf. Das übliche Verfahren in diesen Tagen ist, g für double in printf und lg für double in scanf verwenden. Es spielt keine Rolle, die Sie für printf, weil die printf Bibliothek Funktion behandelt sie als auch, sondern seine entscheidenden, um es richtig für scanf. Printf-Format-Modifikatoren Modifikatoren erscheinen zwischen dem und dem Schlüsselbuchstaben. Eine Zahl ist eine Feldbreite. Und eine Zahl ist eine Präzision Beispiel: printf (6.3f, 2.8) ergibt 2.800 (mit einem Leerzeichen vor dem 2) Beachten Sie, dass 6 die 3 Dezimalstellen und die 1 enthält. - insgesamt 6 Zeichen. Also 6-3-1 2 Zeichen links vom Dezimalpunkt. 0 (die Ziffer Null) bedeutet Pad mit Nullen auf Feldbreite (gewöhnlich nur mit ganzen Zahlen verwendet) l (der Buchstabe) bedeutet lang, z. B. Ld, um ein long int in dezimal zu formatieren Beispiel für 0: 2. 3 (ein Leerzeichen zwischen. Und 3) In 02d ist die 0 nicht Teil der Feldbreite. Es ist ein Modifizierungszeichen. Und wenn Sie eine Feldbreite haben, müssen Sie es so schreiben, dass es nicht mit einer Null beginnen (und dann können Sie eine Null als Modifier Zeichen, wenn Sie das vorgeben). Es ist kein binärer Konvertierungsspezifizierer in glibc normalerweise. Es ist möglich, benutzerdefinierte Umwandlungstypen der printf () - Familie von Funktionen in glibc hinzuzufügen. Details finden Sie unter registerprintffunction. Sie können eine benutzerdefinierte B-Konvertierung für Ihre eigene Verwendung hinzufügen, wenn sie den Anwendungscode vereinfacht, damit er verfügbar ist. Hier ist ein Beispiel für die Implementierung eines benutzerdefinierten printf-Formats in glibc. Auch, was Sie sprechen über w. r.t. Handling mehrerer Ergebnisse sequentiell ist nicht reentrancy per se, sondern einfach der Fallout der Verwendung, was ein globales Objekt, um das Ergebnis zu speichern in. Die Funktion wird nicht wieder eingegeben werden. In C die eigentliche oder zumindest weit verbreitete Idiom für den Umgang mit Funktionen, die ihre Ergebnisse speichern in einem globalen Objekt ist es, diese Ergebnisse sofort nach Erhalt sie zu kopieren. Dies hat den großen Vorteil, dass, wenn nur ein Ergebnis zu einem Zeitpunkt erforderlich ist, keine zusätzliche Zuweisung erforderlich ist. Ndash Greg A. Woods Wir müssen hier nicht einverstanden sein. Ich kann nicht sehen, wie das Hinzufügen eines unauffälligen Präprozessorsymbols kommt irgendwo in der Nähe der Schädlichkeit der Begrenzung der Anwendungsfälle schwer, so dass die Schnittstelle fehleranfällig, Reservierung dauerhaften Speicher für die Dauer des Programms für einen temporären Wert, und die Erzeugung schlimmer Code auf den meisten modernen Plattformen . Ndash R .. Nov 27 12 at 1:53 Die printf () - Familie ist nur in der Lage, in Basis 8, 10 und 16 mit den Standard-Spezifizierer direkt zu drucken. Schlagen Sie vor, eine Funktion zu erstellen, die die Zahl in einen String umwandelt. Alle anderen Antworten haben bisher mindestens eine dieser Einschränkungen. Verwenden Sie statischen Speicher für den Rückgabepuffer. Dies begrenzt die Anzahl der Male, die Funktion als Argument verwendet werden, um () printf. Ordnen Sie die Speicher benötigen die anruf Code frei Zeiger. Erfordern die Aufruf-Code explizit einen geeigneten Puffer zur Verfügung stellen. Rufen Sie printf () direkt auf. Dies erfordert eine neue Funktion für fprintf (). Sprintf (). Vsprintf (). Etc. Verwenden Sie eine reduzierte Reihe von Ganzzahlen. Das Folgende hat keine der obigen Beschränkungen. Es erfordert C99 oder höher und die Verwendung von s. Es verwendet eine Verbindung wörtliche den Pufferraum zur Verfügung zu stellen. Es hat keine Probleme mit mehreren Anrufen in einer printf ().
No comments:
Post a Comment