scanf_s
, , _scanf_s_l
wscanf_s
_wscanf_s_l
Liest formatierte Daten aus dem Standardeingabestream. Diese Versionen von scanf
, _scanf_l
, wscanf
_wscanf_l
haben Sicherheitsverbesserungen, wie in den Sicherheitsfeatures in der CRT beschrieben.
Syntax
int scanf_s(
const char *format [,
argument]...
);
int _scanf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wscanf_s(
const wchar_t *format [,
argument]...
);
int _wscanf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Parameter
format
Formatsteuerzeichenfolge.
argument
Optionale Argumente.
locale
Das zu verwendende Gebietsschema.
Rückgabewert
Gibt die Anzahl der erfolgreich konvertierten und zugewiesenen Felder zurück. Der Rückgabewert enthält keine Felder, die gelesen, aber nicht zugewiesen wurden. Ein Rückgabewert von 0 gibt an, dass keine Felder zugewiesen wurden. Der Rückgabewert ist EOF
für einen Fehler oder wenn das Ende des Dateizeichens oder das Zeichenfolgenendezeichen im ersten Versuch gefunden wird, ein Zeichen zu lesen. Wenn format
es sich um einen NULL
Zeiger handelt, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, geben scanf_s
und wscanf_s
den Wert EOF
zurück und setzen errno
auf EINVAL
.
Informationen zu diesen und anderen Fehlercodes finden Sie unter , , _doserrno
, _sys_errlist
und _sys_nerr
.errno
Hinweise
Die scanf_s
Funktion liest Daten aus dem Standardeingabedatenstrom stdin
und schreibt sie in argument
. Jeder argument
muss ein Zeiger auf einen Variablentyp sein, der dem Typbezeichner in format
entspricht. Wenn der Kopiervorgang zwischen Zeichenfolgen ausgeführt wird, die sich überschneiden, ist das Verhalten nicht definiert.
wscanf_s
ist eine Breitzeichenversion von scanf_s
. Das format
-Argument für wscanf_s
ist eine Breitzeichenfolge. wscanf_s
und scanf_s
verhalten sich identisch, wenn der Stream in ANSI-Modus geöffnet ist. scanf_s
unterstützt derzeit nicht die Eingabe aus einem UNICODE-Stream.
Die Versionen dieser Funktionen mit dem _l
Suffix sind identisch, außer sie verwenden den locale
Parameter anstelle des aktuellen Threadgebietsschemas.
Im Gegensatz scanf
zu und , und wscanf
scanf_s
wscanf_s
erfordern, dass Sie Puffergrößen für einige Parameter angeben. Geben Sie die Größen für alle c
, , C
, s
, S
oder Zeichenfolgen-Steuerelementsatzparameter []
an. Die Puffergröße in Zeichen wird als anderer Parameter übergeben. Er folgt sofort dem Zeiger auf den Puffer oder die Variable. Wenn Sie beispielsweise eine Zeichenfolge lesen, wird die Puffergröße für diese Zeichenfolge wie folgt übergeben:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Die Puffergröße enthält den Terminal null. Sie können ein Feld für die Breitespezifikation verwenden, um sicherzustellen, dass das gelesene Token in den Puffer passt. Wenn ein Token zu groß ist, wird nichts in den Puffer geschrieben, es sei denn, es gibt eine Breiteangabe.
Hinweis
Der Größenparameter ist vom Typ unsigned
und nicht vom Typ size_t
. Verwenden Sie eine statistische Umwandlung, um einen size_t
-Wert in unsigned
für 64-Bit-Buildkonfigurationen zu konvertieren.
Der Parameter für die Puffergröße beschreibt die maximale Anzahl von Zeichen, nicht Bytes. In diesem Beispiel stimmt die Breite des Puffertyps nicht mit der Breite des Formatbezeichners überein.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Der S
Formatbezeichner bedeutet, dass die Von der Funktion unterstützte Standardbreite die Zeichenbreite "entgegengesetzt" verwendet wird. Die Zeichenbreite ist ein byte, die Funktion unterstützt jedoch Doppelbytezeichen. In diesem Beispiel wird eine Zeichenfolge von bis zu neun einzelbyteweiten Zeichen gelesen und in einen Doppelbyte-Breitzeichenpuffer versetzt. Die Zeichen werden als Einzelbytewerte behandelt; die ersten zwei Zeichen werden in ws[0]
gespeichert, die zweiten zwei Zeichen in ws[1]
usw.
In diesem Beispiel wird ein einzelnes Zeichen gelesen:
char c;
scanf_s("%c", &c, 1);
Wenn mehrere Zeichen für nicht null-beendete Zeichenfolgen gelesen werden, werden ganze Zahlen sowohl für die Breite als auch für die Puffergröße verwendet.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Weitere Informationen finden Sie unter scanf
Width Specification.
Mapping generischer Textroutinen
TCHAR.H -Routine |
_UNICODE und _MBCS nicht definiert |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Weitere Informationen finden Sie unter "Formatspezifikationsfelder: scanf
und wscanf
Funktionen".
Anforderungen
Routine | Erforderlicher Header |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> oder <wchar.h> |
Die Konsole wird in UWP-Apps (Universelle Windows-Plattform) nicht unterstützt. Die Standarddatenstromhandles stdin
, stdout
und stderr
müssen umgeleitet werden, bevor C-Laufzeitfunktionen sie in UWP-Apps verwenden können. Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int i,
result;
float fp;
char c,
s[80];
wchar_t wc,
ws[80];
result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
printf( "The number of fields input is %d\n", result );
printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
wc, s, ws);
result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
wprintf( L"The number of fields input is %d\n", result );
wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
c, wc, s, ws);
}
Dieses Programm generiert bei dieser Eingabe die folgende Ausgabe:
71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters
Siehe auch
Mathematische Unterstützung und Gleitkommaunterstützung
Stream-E/A
Gebietsschema
fscanf
, , _fscanf_l
fwscanf
_fwscanf_l
printf
, , _printf_l
wprintf
_wprintf_l
sprintf
, , _sprintf_l
swprintf
, , _swprintf_l
__swprintf_l
sscanf
, , _sscanf_l
swscanf
_swscanf_l