Freigeben über


scanf_s, , _scanf_s_lwscanf_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_errlistund _sys_nerr.errno

Hinweise

Die scanf_s Funktion liest Daten aus dem Standardeingabedatenstrom stdinund schreibt sie in argument. Jeder argument muss ein Zeiger auf einen Variablentyp sein, der dem Typbezeichner in formatentspricht. 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 wscanfscanf_s wscanf_s erfordern, dass Sie Puffergrößen für einige Parameter angeben. Geben Sie die Größen für alle c, , C, s, Soder 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, stdoutund 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_lfwscanf_fwscanf_l
printf, , _printf_lwprintf_wprintf_l
sprintf, , _sprintf_lswprintf, , _swprintf_l__swprintf_l
sscanf, , _sscanf_lswscanf_swscanf_l