Share via


vscanf_s, vwscanf_s

從標準輸入資料流讀取格式化資料。 這些版本的 vscanf 具有 vwscanf 安全性增強功能,如 CRT 中的安全性功能中所述

語法

int vscanf_s(
   const char *format,
   va_list arglist
);
int vwscanf_s(
   const wchar_t *format,
   va_list arglist
);

參數

format
格式控制字串。

arglist
變數引數清單。

傳回值

傳回已成功轉換並指派的欄位數目;傳回值不包含已讀取但未指派的欄位。 傳回值 0 表示未指派任何欄位。 傳回值為 EOF 時表示錯誤,或表示第一次嘗試讀取字元時遇到檔案結尾字元或字串結尾字元。 如果 formatNULL 指標,則會叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,則 vscanf_svwscanf_s 會傳回 EOF,且 errno 設為 EINVAL

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

備註

vscanf_s 函式會讀取標準輸入資料流 stdin 的資料,並將資料寫入 arglist 引數清單指定的位置。 清單中的每個引數都必須是變數的指標,而變數的類型對應至 format 中的類型指定名稱。 如果在重疊的字串之間進行複製,則行為是未定義的。

vwscanf_s 是寬字元版本的 vscanf_sformatvwscanf_s 引數是寬字元字串。 如果資料流在 ANSI 模式中開啟,則 vwscanf_svscanf_s 的行為相同。 vscanf_s 不支援來自 UNICODE 資料流的輸入。

與 和 不同,而且需要針對 c 、C s、 S 或字串控制集的所有輸入參數 指定緩衝區大小,這些參數會以 [] 括住。 vwscanf_svscanf_svscanfvwscanf 字元中的緩衝區大小會以另一個參數的形式傳遞,緊接在緩衝區或變數的指標之後。 字串的緩衝區 wchar_t 大小與位元組大小不同。

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

注意

參數 size 的類型為 unsigned ,而非 size_t

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

泛型文字常式對應

TCHAR.H 常式 _UNICODE_MBCS 未定義 _MBCS 定義 _UNICODE 定義
_vtscanf_s vscanf_s vscanf_s vwscanf_s

如需詳細資訊,請參閱 格式化規格欄位: scanfwscanf 函式

需求

常式 必要的標頭
vscanf_s <stdio.h>
wscanf_s <stdio.h > 或 < wchar.h>

通用 Windows 平臺 (UWP) 應用程式中不支援主控台。 與主控台、 stdinstdoutstderr 相關聯的標準資料流程控制碼必須先重新導向,C 執行時間函式才能在 UWP 應用程式中使用這些控制碼。 如需相容性詳細資訊,請參閱相容性

範例

// crt_vscanf_s.c
// compile with: /W3
// This program uses the vscanf_s and vwscanf_s functions
// to read formatted input.

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

int call_vscanf_s(char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int call_vwscanf_s(wchar_t *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vwscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int main( void )
{
    int   i, result;
    float fp;
    char  c, s[81];
    wchar_t wc, ws[81];
    result = call_vscanf_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 = call_vwscanf_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);
}

當此程式獲得範例輸入時,它會產生以下輸出︰

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

另請參閱

數學和浮點支援
資料流 I/O
地區設定
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
vscanf, vwscanf