Share via


sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

從字串讀取格式化的資料。 這些版本的 sscanf_sscanf_lswscanf_swscanf_l 具有安全性增強功能,如 CRT 中的安全性功能中所述。

語法

int sscanf_s(
   const char *buffer,
   const char *format [,
   argument ] ...
);
int _sscanf_s_l(
   const char *buffer,
   const char *format,
   _locale_t locale [,
   argument ] ...
);
int swscanf_s(
   const wchar_t *buffer,
   const wchar_t *format [,
   argument ] ...
);
int _swscanf_s_l(
   const wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument ] ...
);

參數

buffer
已儲存資料

format
格式控制字串。 如需詳細資訊,請參閱 格式化規格欄位: scanfwscanf 函式

argument
選擇性引數

locale
要使用的地區設定

傳回值

每個函式都會傳回成功轉換並指派的欄位數目。 傳回值不包含已讀取但未指派的欄位。 傳回值 0 表示未指派任何欄位。 傳回值是 EOF,其表示發生錯誤或在進行第一次轉換之前就到達字串結尾。

如果 bufferformatNULL 指標,則會叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,則這些函式會傳回 -1,並將 errno 設為 EINVAL

如需這些錯誤碼和其他錯誤碼的相關資訊,請參閱 errno_doserrno_sys_errlist_sys_nerr

備註

sscanf_s 函式會將 buffer 中的資料讀入每個 argument 所指定的位置。 格式字串後的引數指定變數的指標,而變數的類型對應至 format 中的類型指定名稱。 與不安全版本 sscanf 不同,使用類型欄位字元 cCsS 或用 [] 括住的字串控制集時,需要緩衝區大小參數。 字元中的緩衝區大小必須立即提供為需要它的每個緩衝區參數之後的額外參數。 例如,如果您要讀取字串,則會傳遞該字串的緩衝區大小,如下所示:

wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9

緩衝區大小包含結束的 null。 寬度規格欄位可以用來確保讀入的 Token 可納入緩衝區。 如果未使用寬度規格欄位,而且讀取中的標記太大而無法放入緩衝區中,則不會寫入該緩衝區。

單一字元可以讀取如下:

wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);

這個範例會從輸入字串讀取單一字元,然後將其儲存在寬字元緩衝區。 讀取非 Null 終止字串的多個字元時,不帶正負號的整數會用作寬度規格和緩衝區大小。

char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated

如需詳細資訊,請參閱 scanf_swscanf_s_scanf_s_l_wscanf_s_lscanf 類型欄位字元。

注意

大小參數為型別 unsigned,而非 size_t。 針對 64 位元目標編譯時,請使用靜態轉型將 _countofsizeof 結果轉換成正確大小。

format 引數會控制輸入欄位的解譯,而且形式和功能與 scanf_s 函式的 format 引數相同。 如果在重疊的字串之間進行複製,則行為是未定義的。

swscanf_ssscanf_s的寬字元版本; swscanf_s 的引數是寬字元字串。 sscanf_s 不會處理多位元組十六進位字元。 swscanf_s 不會處理 Unicode 全形十六進位或「相容性區域」字元。 否則 swscanf_ssscanf_s 的行為相同。

這些有 _l 尾碼的函式版本是一樣的,不同之處在於會使用傳入的地區設定參數,而不使用目前的執行緒地區設定。

泛型文字常式對應

TCHAR.H 常規 _UNICODE_MBCS 未定義 _MBCS 定義 _UNICODE 定義
_stscanf_s sscanf_s sscanf_s swscanf_s
_stscanf_s_l _sscanf_s_l _sscanf_s_l _swscanf_s_l

需求

常式 必要的標頭
sscanf_s, _sscanf_s_l <stdio.h>
swscanf_s, _swscanf_s_l <stdio.h><wchar.h>

如需相容性詳細資訊,請參閱相容性

範例

// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string plus null terminator
   sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
   sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );
   sscanf_s( tokenstring, "%d", &i );
   sscanf_s( tokenstring, "%f", &fp );

   // Output the data read
   printf_s( "String    = %s\n", s );
   printf_s( "Character = %c\n", c );
   printf_s( "Integer:  = %d\n", i );
   printf_s( "Real:     = %f\n", fp );
}
String    = 15
Character = 1
Integer:  = 15
Real:     = 15.000000

另請參閱

資料流 I/O
fscanf, _fscanf_l, fwscanf, _fwscanf_l
scanf, _scanf_l, wscanf, _wscanf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
snprintf, _snprintf, _snprintf_l, _snwprintf, _snwprintf_l