Namespaces
Variants

wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s

From cppreference.net
< c ‎ | io
Definiert in Header <wchar.h>
(1)
int wprintf ( const wchar_t * format, ... ) ;
(seit C95)
(bis C99)
int wprintf ( const wchar_t * restrict format, ... ) ;
(seit C99)
(2)
int fwprintf ( FILE * stream, const wchar_t * format, ... ) ;
(seit C95)
(bis C99)
int fwprintf ( FILE * restrict stream,
const wchar_t * restrict format, ... ) ;
(seit C99)
(3)
int swprintf ( wchar_t * buffer, size_t bufsz,
const wchar_t * format, ... ) ;
(seit C95)
(bis C99)
int swprintf ( wchar_t * restrict buffer, size_t bufsz,
const wchar_t * restrict format, ... ) ;
(seit C99)
int wprintf_s ( const wchar_t * restrict format, ... ) ;
(4) (seit C11)
int fwprintf_s ( FILE * restrict stream,
const wchar_t * restrict format, ... ) ;
(5) (seit C11)
int swprintf_s ( wchar_t * restrict buffer, rsize_t bufsz,
const wchar_t * restrict format, ... ) ;
(6) (seit C11)
int snwprintf_s ( wchar_t * restrict s, rsize_t n,
const wchar_t * restrict format, ... ) ;
(7) (seit C11)

Lädt die Daten von den angegebenen Speicherorten, konvertiert sie in entsprechende Breitzeichenketten und schreibt die Ergebnisse in verschiedene Senken.

1) Schreibt die Ergebnisse in stdout .
2) Schreibt die Ergebnisse in einen Dateistrom stream .
3) Wenn bufsz größer als null ist, schreibt die Ergebnisse in einen Breitzeichen-String buffer . Höchstens bufsz - 1 Breitzeichen werden geschrieben, gefolgt vom Null-Breitzeichen. Wenn bufsz null ist, wird nichts geschrieben (und buffer kann ein Nullzeiger sein).
4-6) Gleich wie (1-3) , außer dass die folgenden Fehler zur Laufzeit erkannt werden und die aktuell installierte constraint handler -Funktion aufrufen:
  • der Konvertierungsspezifizierer %n ist in format vorhanden
  • eines der Argumente, die %s entsprechen, ist ein Nullzeiger
  • format oder buffer ist ein Nullzeiger
  • bufsz ist null oder größer als RSIZE_MAX / sizeof ( wchar_t )
  • Kodierungsfehler in einem der String- und Zeichenkonvertierungsspezifizierer auftreten
  • (nur für swprintf_s ) die Anzahl der zu schreibenden Breitzeichen, einschließlich des Nullzeichens, würde bufsz überschreiten.
7) Gleich wie (6) , außer dass das Ergebnis abgeschnitten wird, um in das durch s gezeigte Array zu passen.
Wie bei allen grenzprüfenden Funktionen sind wprintf_s , fwprintf_s , swprintf_s und snwprintf_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <stdio.h> eingebunden wird.

Inhaltsverzeichnis

Parameter

stream - Ausgabedateistream, in den geschrieben wird
buffer - Zeiger auf eine Breitzeichen-Zeichenkette, in die geschrieben wird
bufsz - bis zu bufsz - 1 Breitzeichen können geschrieben werden, plus den Nullterminator
format - Zeiger auf eine nullterminierte Breitzeichen-Zeichenkette, die angibt, wie die Daten zu interpretieren sind
... - Argumente, die die auszugebenden Daten spezifizieren. Wenn ein Argument nach Standardargument-Promotions nicht dem vom entsprechenden Konvertierungsspezifizierer erwarteten Typ entspricht, oder wenn weniger Argumente vorhanden sind als von format benötigt, ist das Verhalten undefiniert. Wenn mehr Argumente vorhanden sind als von format benötigt, werden die überzähligen Argumente ausgewertet und ignoriert.


Die Format -Zeichenkette besteht aus gewöhnlichen Breitzeichen (außer % ), die unverändert in den Ausgabestrom kopiert werden, und Konvertierungsspezifikationen. Jede Konvertierungsspezifikation hat folgendes Format:

  • Einleitendes % Zeichen.
  • (optional) ein oder mehrere Flags, die das Verhalten der Konvertierung modifizieren:
  • - : das Ergebnis der Konvertierung wird innerhalb des Feldes linksbündig ausgerichtet (standardmäßig ist es rechtsbündig).
  • + : das Vorzeichen von vorzeichenbehafteten Konvertierungen wird immer dem Ergebnis vorangestellt (standardmäßig wird das Minus nur bei negativen Ergebnissen vorangestellt).
  • space : wenn das Ergebnis einer vorzeichenbehafteten Konvertierung nicht mit einem Vorzeichen beginnt oder leer ist, wird ein Leerzeichen dem Ergebnis vorangestellt. Wird ignoriert, wenn das + Flag vorhanden ist.
  • # : alternative Form der Konvertierung wird durchgeführt. Siehe die nachfolgende Tabelle für genaue Auswirkungen, andernfalls ist das Verhalten undefiniert.
  • 0 : für Ganzzahl- und Gleitkommazahl-Konvertierungen werden führende Nullen zum Auffüllen des Feldes verwendet statt space Zeichen. Für Ganzzahlen wird es ignoriert, wenn die Genauigkeit explizit angegeben ist. Für andere Konvertierungen führt die Verwendung dieses Flags zu undefiniertem Verhalten. Wird ignoriert, wenn das - Flag vorhanden ist.
  • (optional) Ganzzahlwert oder * , der die minimale Feldbreite angibt. Das Ergebnis wird bei Bedarf auf der linken Seite (bei rechtsbündiger Ausrichtung) oder auf der rechten Seite (bei linksbündiger Ausrichtung) mit Leerzeichen aufgefüllt (standardmäßig). Falls * verwendet wird, wird die Breite durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument und dem die Genauigkeit liefernden Argument (falls vorhanden) erscheint. Wenn der Wert des Arguments negativ ist, führt dies zur Angabe des - -Flags und einer positiven Feldbreite (Hinweis: Dies ist die minimale Breite: Der Wert wird niemals abgeschnitten.).
  • (optional) . gefolgt von einer Ganzzahl oder * , oder keines von beiden, was die Präzision der Konvertierung spezifiziert. Falls * verwendet wird, wird die Präzision durch ein zusätzliches Argument vom Typ int angegeben, das vor dem zu konvertierenden Argument erscheint, aber nach dem Argument, das die minimale Feldbreite liefert, falls eines angegeben wurde. Wenn der Wert dieses Arguments negativ ist, wird er ignoriert. Wenn weder eine Zahl noch * verwendet wird, wird die Präzision als Null angenommen. Siehe die nachfolgende Tabelle für die genauen Auswirkungen der Präzision .
  • (optional) Längenmodifikator der die Größe des Arguments spezifiziert (in Kombination mit dem Konvertierungsformat-Spezifizierer bestimmt er den Typ des entsprechenden Arguments).
  • Konvertierungsformat-Spezifizierer.

Die folgenden Formatbezeichner sind verfügbar:

Konvertierungsspezifizierer Erklärung Erwarteter
Argumenttyp
Längenmodifikator→ hh h keine l ll j z t L
Nur verfügbar seit C99→ Ja Ja Ja Ja Ja
% Schreibt ein literales % . Die vollständige Konvertierungsspezifikation muss %% lauten. N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

Schreibt ein einzelnes Zeichen .

  • Das Argument wird zunächst in wchar_t konvertiert, wie durch den Aufruf von btowc .
  • Wenn der l -Modifikator verwendet wird, wird das wint_t -Argument zunächst in wchar_t konvertiert.
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

Schreibt eine Zeichenkette .

  • Das Argument muss ein Zeiger auf das erste Element eines Zeichenarrays sein, das eine Multibyte-Zeichensequenz enthält, die im initialen Shift-Zustand beginnt. Diese wird in ein Wide-Character-Array konvertiert, als ob durch einen Aufruf von mbrtowc mit einem nullinitialisierten Konvertierungszustand.
  • Präzision gibt die maximale Anzahl an Wide Characters an, die geschrieben werden sollen. Wenn Präzision nicht angegeben ist, werden alle Wide Characters bis zum ersten Nullterminator (ausschließlich) geschrieben.
  • Wenn der l -Spezifizierer verwendet wird, muss das Argument ein Zeiger auf das erste Element eines Arrays von wchar_t sein.
N/A N/A
char *
wchar_t *
N/A N/A N/A N/A N/A
d
i

Wandelt einen vorzeichenbehafteten Integer in die Dezimaldarstellung [-]dddd um.

  • Präzision gibt die Mindestanzahl der anzuzeigenden Ziffern an. Die Standardpräzision ist 1 .
  • Wenn sowohl der konvertierte Wert als auch die Präzision 0 sind, ergibt die Konvertierung keine Zeichen.
  • Für den z -Modifikator ist der erwartete Argumenttyp die vorzeichenbehaftete Version von size_t .
signed char
short
int
long
long long
N/A
o

Konvertiert eine vorzeichenlose Ganzzahl in die Oktaldarstellung oooo .

  • Präzision gibt die Mindestanzahl der anzuzeigenden Ziffern an. Die Standardpräzision ist 1 .
  • Wenn sowohl der konvertierte Wert als auch die Präzision 0 sind, ergibt die Konvertierung keine Zeichen.
  • In der alternativen Implementierung wird die Präzision bei Bedarf erhöht, um eine führende Null zu schreiben. In diesem Fall wird, wenn sowohl der konvertierte Wert als auch die Präzision 0 sind, eine einzelne 0 geschrieben.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
vorzeichenlose Version von ptrdiff_t
N/A
x
X

Wandelt eine vorzeichenlose Ganzzahl in die hexadezimale Darstellung hhhh um.

  • Für die x -Konversion werden die Buchstaben abcdef verwendet.
  • Für die X -Konversion werden die Buchstaben ABCDEF verwendet.
  • Präzision gibt die Mindestanzahl der anzuzeigenden Ziffern an. Die Standardpräzision ist 1 .
  • Wenn sowohl der konvertierte Wert als auch die Präzision 0 sind, ergibt die Konversion keine Zeichen.
  • In der alternativen Implementierung wird 0x oder 0X nichtnull-Werten vorangestellt.
N/A
u

Wandelt eine unsigned integer in die Dezimaldarstellung dddd um.

  • Precision gibt die Mindestanzahl der anzuzeigenden Ziffern an.
  • Die Standard-Präzision ist 1 .
  • Wenn sowohl der konvertierte Wert als auch die Präzision 0 sind, ergibt die Konvertierung keine Zeichen.
N/A
f
F (C99)

Wandelt eine Gleitkommazahl in die Dezimalschreibweise im Format [-]ddd.ddd um.

  • Präzision gibt die exakte Anzahl der Nachkommastellen an.
  • Die Standardpräzision ist 6 .
  • In der alternativen Implementierung wird das Dezimaltrennzeichen auch ohne folgende Ziffern geschrieben.
  • Für die Konvertierung von Unendlich und NaN siehe Hinweise .
N/A N/A
double
double (C99)
N/A N/A N/A N/A
long double
e
E

Wandelt eine Gleitkommazahl in die dezimale Exponentenschreibweise um.

  • Für den e -Konvertierungsstil wird [-]d.ddd  e ±dd verwendet.
  • Für den E -Konvertierungsstil wird [-]d.ddd  E ±dd verwendet.
  • Der Exponent enthält mindestens zwei Ziffern, weitere Ziffern werden nur bei Bedarf verwendet.
  • Wenn der Wert 0 ist, ist der Exponent ebenfalls 0 .
  • Präzision gibt die exakte Anzahl der Ziffern nach dem Dezimaltrennzeichen an.
  • Die Standardpräzision ist 6 .
  • In der alternativen Implementierung wird das Dezimaltrennzeichen auch dann geschrieben, wenn keine Ziffern folgen.
  • Für die Konvertierung von Unendlich und NaN siehe Hinweise .
N/A N/A N/A N/A N/A N/A
a
A

(C99)

Wandelt eine Gleitkommazahl in die hexadezimale Exponentenschreibweise um.

  • Für den a -Konvertierungsstil wird [-]  0x h.hhh  p ±d verwendet.
  • Für den A -Konvertierungsstil wird [-]  0X h.hhh  P ±d verwendet.
  • Die erste hexadezimale Ziffer ist nicht 0 , wenn das Argument ein normalisierter Gleitkommawert ist.
  • Wenn der Wert 0 ist, ist der Exponent ebenfalls 0 .
  • Präzision gibt die exakte Anzahl der Ziffern an, die nach dem hexadezimalen Punktzeichen erscheinen sollen.
  • Die Standardpräzision ist ausreichend für die exakte Darstellung des Wertes.
  • In der alternativen Implementierung wird das Dezimalpunktzeichen auch dann geschrieben, wenn keine Ziffern darauf folgen.
  • Für die Konvertierung von Unendlich und NaN siehe Hinweise .
N/A N/A N/A N/A N/A N/A
g
G

Konvertiert eine Gleitkommazahl in Dezimal- oder Exponentenschreibweise, abhängig vom Wert und der Genauigkeit .

  • Für den g -Konvertierungsstil wird die Konvertierung mit Stil e oder f durchgeführt.
  • Für den G -Konvertierungsstil wird die Konvertierung mit Stil E oder f (bis C99) F (seit C99) durchgeführt.
  • Sei P gleich der Genauigkeit, falls nicht null, 6 falls die Genauigkeit nicht angegeben ist, oder 1 falls die Genauigkeit 0 ist. Wenn eine Konvertierung mit Stil E einen Exponenten von X hätte:
    • Wenn P > X ≥ −4 , erfolgt die Konvertierung mit Stil f oder F (seit C99) und Genauigkeit P − 1 − X .
    • Andernfalls erfolgt die Konvertierung mit Stil e oder E und Genauigkeit P − 1 .
  • Sofern keine alternative Darstellung angefordert wird, werden nachgestellte Nullen entfernt, und das Dezimaltrennzeichen wird entfernt, falls kein Nachkommateil verbleibt.
  • Für die Konvertierung von Unendlich und NaN siehe Hinweise .
N/A N/A N/A N/A N/A N/A
n

Gibt die Anzahl der bisher geschriebenen Zeichen durch diesen Funktionsaufruf zurück.

  • Das Ergebnis wird an die durch das Argument gezeigte Adresse geschrieben .
  • Die Spezifikation darf keine Flags , Feldbreite oder Genauigkeit enthalten.
  • Für den z -Modifikator ist der erwartete Argumenttyp S * , wobei S die signierte Version von size_t ist.
signed char *
short *
int *
long *
long long *
N/A
p

Schreibt eine implementierungsdefinierte Zeichenfolge, die einen Zeiger definiert.

N/A N/A
void *
N/A N/A N/A N/A N/A N/A
Hinweise

Die Gleitkomma-Konvertierungsfunktionen konvertieren Unendlich zu inf oder infinity . Welches verwendet wird, ist implementierungsdefiniert.

Keine-Zahl wird zu nan oder nan( char_sequence ) konvertiert. Welches verwendet wird, ist implementierungsdefiniert.

Die Konvertierungen F , E , G , A geben stattdessen INF , INFINITY , NAN aus.

Der Konvertierungsspezifizierer zur Ausgabe von char , unsigned char , signed char , short und unsigned short erwartet höherstufige Typen von Standardargument-Promotions , aber vor der Ausgabe wird sein Wert zu char , unsigned char , signed char , short und unsigned short konvertiert. Es ist sicher, Werte dieser Typen zu übergeben, aufgrund der Promotion, die beim Aufruf einer variadischen Funktion stattfindet.

Die korrekten Konvertierungsspezifikationen für die festbreiten Zeichentypen ( int8_t usw.) sind im Header <inttypes.h> definiert (obwohl PRIdMAX , PRIuMAX usw. synonym mit %jd , %ju usw. sind).

Der speicher-schreibende Konvertierungsspezifizierer %n ist ein häufiges Ziel von Sicherheitslücken, bei denen Formatstrings von Benutzereingaben abhängen und wird von der grenzprüfenden printf_s -Funktionsfamilie nicht unterstützt (seit C11) .

Es gibt einen Sequenzpunkt nach der Aktion jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer %n -Ergebnisse in derselben Variable oder, als Grenzfall, die Ausgabe einer Zeichenkette, die durch einen früheren %n innerhalb desselben Aufrufs modifiziert wurde.

Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert.

Rückgabewert

1,2) Anzahl der geschriebenen Breitzeichen bei Erfolg oder negativer Wert bei einem Fehler.
3) Anzahl der geschriebenen Breitzeichen (ohne das abschließende Null-Breitzeichen) bei Erfolg oder ein negativer Wert bei einem Kodierungsfehler oder wenn die Anzahl der zu erzeugenden Zeichen gleich oder größer als bufsz war (einschließlich wenn bufsz null ist).
4,5) Anzahl der geschriebenen Breitzeichen bei Erfolg oder negativer Wert bei einem Fehler.
6) Anzahl der Breitzeichen (ohne das abschließende Nullzeichen), die in den buffer geschrieben wurden. Gibt einen negativen Wert bei Kodierungsfehlern und Überlauf zurück. Gibt null bei allen anderen Fehlern zurück.
7) Anzahl der Breitzeichen (ohne das abschließende Nullzeichen), die in den buffer geschrieben worden wären, wenn bufsz ausreichend groß gewesen wäre, oder ein negativer Wert bei einem Fehler. (Das bedeutet, der Schreibvorgang war nur dann erfolgreich und vollständig, wenn der Rückgabewert nicht-negativ und kleiner als bufsz ist)

Hinweise

Während schmale Zeichenketten snprintf bereitstellen, was die Bestimmung der benötigten Ausgabepuffergröße ermöglicht, existiert kein Äquivalent für breite Zeichenketten (bis snwprintf_s ) (seit C11) , und um die Puffergröße zu bestimmen, muss das Programm möglicherweise swprintf aufrufen, den Rückgabewert prüfen und einen größeren Puffer allozieren, um es erneut zu versuchen, bis es erfolgreich ist.

snwprintf_s , im Gegensatz zu swprintf_s , wird das Ergebnis kürzen, um in das Array zu passen, auf das buffer zeigt, obwohl Kürzung von den meisten grenzprüfenden Funktionen als Fehler behandelt wird.

Beispiel

#include <locale.h>
#include <wchar.h>
int main(void)
{
    char narrow_str[] = "z\u00df\u6c34\U0001f34c";
                  // or "zß水🍌"
                  // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";
    wchar_t warr[29]; // the expected string is 28 characters plus 1 null terminator
    setlocale(LC_ALL, "en_US.utf8");
    swprintf(warr, sizeof warr / sizeof* warr,
             L"Converted from UTF-8: '%s'", narrow_str);
    wprintf(L"%ls\n", warr);
}

Ausgabe:

Converted from UTF-8: 'zß水🍌'

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.29.2.1 Die fwprintf-Funktion (S.: TBD)
  • 7.29.2.3 Die swprintf-Funktion (S.: TBD)
  • 7.29.2.11 Die wprintf-Funktion (S.: TBD)
  • K.3.9.1.1 Die fwprintf_s-Funktion (S.: TBD)
  • K.3.9.1.4 Die swprintf_s-Funktion (S.: TBD)
  • K.3.9.1.13 Die wprintf_s-Funktion (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.29.2.1 Die fwprintf-Funktion (S.: TBD)
  • 7.29.2.3 Die swprintf-Funktion (S.: TBD)
  • 7.29.2.11 Die wprintf-Funktion (S.: TBD)
  • K.3.9.1.1 Die fwprintf_s-Funktion (S.: TBD)
  • K.3.9.1.4 Die swprintf_s-Funktion (S.: TBD)
  • K.3.9.1.13 Die wprintf_s-Funktion (S.: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.29.2.1 Die fwprintf-Funktion (S: 403-410)
  • 7.29.2.3 Die swprintf-Funktion (S: 416)
  • 7.29.2.11 Die wprintf-Funktion (S: 421)
  • K.3.9.1.1 Die fwprintf_s-Funktion (S: 628)
  • K.3.9.1.4 Die swprintf_s-Funktion (S: 630-631)
  • K.3.9.1.13 Die wprintf_s-Funktion (S: 637-638)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.24.2.1 Die fwprintf-Funktion (S. 349-356)
  • 7.24.2.3 Die swprintf-Funktion (S. 362)
  • 7.24.2.11 Die wprintf-Funktion (S. 366)

Siehe auch

gibt formatierte Ausgabe an stdout , einen Dateistrom oder einen Puffer aus
(Funktion)
gibt formatierte Breitzeichen-Ausgabe an stdout , einen Dateistrom
oder einen Puffer unter Verwendung einer variablen Argumentenliste aus
(Funktion)
(C95)
schreibt eine Breitzeichen-Zeichenkette in einen Dateistrom
(Funktion)
C++-Dokumentation für wprintf , fwprintf , swprintf