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 對等用法
請參閱 Parse 方法,例如 System::Double::Parse。
請參閱
參考
fscanf、 _fscanf_l、 fwscanf、 _fwscanf_l
printf、 _printf_l、 wprintf、 _wprintf_l