共用方式為


scanf_s、 _scanf_s_l、 wscanf_s、 _wscanf_s_l

讀取從標準輸入資料流的格式化資料。 這些是 scanf、 _scanf_l、 wscanf、 _wscanf_l 的安全性增強版本,如 安全性功能,則在 CRT 中 中所述。

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]... 
);

參數

  • format
    格式控制字串。

  • argument
    選擇性參數。

  • locale
    使用的地區設定。

傳回值

傳回欄位轉換成功的和指定數字;傳回值不包括讀取,但未指定的欄位。 傳回值 0 表示欄位未指定。 傳回值是錯誤的 EOF,或者檔案結尾字元或字串結束字元在第一次嘗試遇到讀取字元。 如果 format 是 NULL 指標,無效的參數叫用處理常式,如 參數驗證中所述。 如果執行允許繼續, scanf_s 和 wscanf_s 傳回 EOF 並將 errno 設為 EINVAL。

如需這些屬性和其他錯誤碼的詳細資訊,請參閱 _doserrno、errno、_sys_errlist 和 _sys_nerr

備註

scanf_s函式會從標準輸入資料流 stdin的資料並將資料寫入 argument指定的位置。 每個 argument 必須是指標對應至 format的型別規範型別的變數。 如果複製發生在重疊的字串之間,行為是未定義。

wscanf_s是 scanf_s的寬字元版本;為 wscanf_s的 format 引數是寬字元字串。 資料流,則在 ANSI 模式中,開啟wscanf_s和 scanf_s相同的作用完全相同。 scanf_s 目前不支援從 UNICODE 資料流的輸入。

這些函式的以 _l 後綴版本相同,但使用傳遞的地區設定參數而非目前執行緒的地區設定。

不同於 scanf和 wscanf, scanf_s和 wscanf_s要求緩衝區大小為型別指定 c、 C、 s、 S或 [的任何輸入參數。 在字元的緩衝區大小會當做指標後的額外參數到緩衝區或變數。 例如,讀取,則傳回字串,該字串的緩衝區大小將如下所示:

char s[10];

scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9

緩衝區的大小 (包括結尾的 NULL。 寬度規格欄位可用來確保寫入的語彙基元會放入緩衝區。 如果沒有使用寬度規格欄位,因此,讀取語彙基元太大而無法符合緩衝區,則該緩衝區不會被覆寫。

注意事項注意事項

大小參數是 unsigned型別,也不是 size_t。

下列範例會示範,緩衝區大小參數描述最大字元數,而不是位元組。 在呼叫 wscanf_s時,由緩衝區型別表示的字元寬度不符合格式規範表示的字元寬度。

wchar_t ws[10];
wscanf_s("%9S", ws, _countof(ws));

S 格式規範表示為「在」預設寬度相反由函式支援使用的字元寬度。 字元寬度是單一位元組,不過,函式支援雙位元組字元。 這個範例在雙位元組字元緩衝區寫入 9 單一位元組字元字串並將它們。 字元視為單一位元組值;前兩個字元在 ws[0]儲存在 ws[1]中,第二個兩個儲存,依此類推。

在字元的情況下,一個可能會讀取單一字元如下:

char c;

scanf_s("%c", &c, 1);

當讀取非 null 結尾字串的一個或多個字元時,整數當做寬度規格和緩衝區大小。

char c[4];

scanf_s("%4c", &c, _countof(c)); // not null terminated

如需詳細資訊,請參閱scanf 寬度規格

泛用文字常式對應

TCHAR.H 常式

未定義 _UNICODE & _MBCS

已定義 _MBCS

已定義 _UNICODE

_tscanf_s

scanf_s

scanf_s

wscanf_s

_tscanf_s_l

_scanf_s_l

_scanf_s_l

_wscanf_s_l

如需詳細資訊,請參閱 格式規格欄位— scanf 函式和 wscanf 函式

需求

程序

必要的標頭檔

scanf_s, _scanf_s_l

<stdio.h>

wscanf_s, _wscanf_s_l

<stdio.h> 或 <wchar.h>

主控台 Windows 市集 應用程式不支援。 標準資料流控制代碼與主控台, stdin, stdout和 stderr,在這種情況下, C 執行階段函式在 Windows 市集 應用程式之前,可以使用它們必須重新導向。 如需其他相容性資訊,請參閱入門介紹中的 相容性 (Compatibility)

範例

// 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, _countof(s), ws, _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, _countof(s), ws, _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);
}
  

.NET Framework 對等用法

請參閱

參考

浮點支援

資料流 I/O

地區設定

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