?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
Defined in header <stdio.h> | ||
---|---|---|
int vscanf( const char *restrict format, va_list vlist ); | (1) | (since C99) |
int vfscanf( FILE *restrict stream, const char *restrict format, va_list vlist ); | (2) | (since C99) |
int vsscanf( const char *restrict buffer, const char *restrict format, va_list vlist ); | (3) | (since C99) |
int vscanf_s(const char *restrict format, va_list vlist); | (4) | (since C11) |
int vfscanf_s( FILE *restrict stream, const char *restrict format, va_list vlist); | (5) | (since C11) |
int vsscanf_s( const char *restrict buffer, const char *restrict format, va_list vlist); | (6) | (since C11) |
從各種來源讀取數(shù)據(jù),根據(jù)其解釋并將format
結(jié)果存儲到由其定義的位置vlist
。
1)從中讀取數(shù)據(jù) stdin
2)從文件流中讀取數(shù)據(jù) stream
3)從以空字符結(jié)尾的字符串讀取數(shù)據(jù)buffer
。到達(dá)字符串的末尾等同于達(dá)到文件結(jié)束條件fscanf
4-6)與(1-3)相同,不同之處在于%c
,%s
和%[
轉(zhuǎn)換說明符每個都需要兩個參數(shù)(通常的指針和rsize_t
表示接收數(shù)組大小的類型值,當(dāng)使用%c讀取時可能為1成一個字符),除了在運行時檢測到以下錯誤并調(diào)用當(dāng)前安裝的約束處理函數(shù):
指針類型的任何參數(shù)都是空指針
format
,stream
或者buffer
是空指針
%c,%s或%[,加上終止空字符,將會超過為每個轉(zhuǎn)換說明符提供的第二個(rsize_t)參數(shù)所寫的字符數(shù)
可選地,還有任何其他可檢測到的錯誤,例如未知的轉(zhuǎn)換說明符
由于所有的邊界檢查功能,vscanf_s
,vfscanf_s
,和vsscanf_s
僅保證可供如果__STDC_LIB_EXT1__
由實現(xiàn)所定義,并且如果用戶定義__STDC_WANT_LIB_EXT1__
的整數(shù)常數(shù)1
,包括之前<stdio.h>
。
流 | - | 輸入文件流從中讀取 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
緩沖 | - | 指向以null結(jié)尾的字符串讀取的指針 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
格式 | - | 指向以空字符結(jié)尾的字符串的指針,指定如何讀取輸入。格式字符串由。非空白多字節(jié)字符除%以外:格式字符串中的每個這樣的字符只會從輸入流中消耗一個完全相同的字符,或者如果流中的下一個字符不相等,則會導(dǎo)致函數(shù)失敗??崭褡址焊袷阶址械娜魏螁蝹€空白字符都會消耗輸入中的所有可用連續(xù)空格字符(如同通過調(diào)用循環(huán)中的isspace一樣來確定)。請注意,格式字符串中的“\ n”,“”,“\ t \ t”或其他空格沒有區(qū)別。轉(zhuǎn)換規(guī)格。每個轉(zhuǎn)換規(guī)范具有以下格式:介紹%字符(可選)分配抑制字符*。如果存在此選項,則函數(shù)不會將轉(zhuǎn)換結(jié)果分配給任何接收參數(shù)。(可選)指定最大字段寬度的整數(shù)數(shù)字(大于零),即該函數(shù)在執(zhí)行當(dāng)前轉(zhuǎn)換規(guī)范指定的轉(zhuǎn)換時允許使用的最大字符數(shù)。請注意,如果未提供寬度,%s和%[可能會導(dǎo)致緩沖區(qū)溢出。(可選)長度修飾符,用于指定接收參數(shù)的大小,即實際的目標(biāo)類型。這會影響轉(zhuǎn)換精度和溢出規(guī)則。每種轉(zhuǎn)換類型的默認(rèn)目標(biāo)類型都不相同(請參閱下表)。轉(zhuǎn)換格式說明符以下格式說明符可用:轉(zhuǎn)換說明符說明參數(shù)類型長度修飾符hh(C99)。h(無)ll(C99)。j(C99)。z(C99)。t(C99)。L%匹配字面值%N / AN / AN / AN / AN / AN / AN / AN / AN / c與字符或字符序列匹配如果使用寬度說明符,則匹配完全寬度字符(參數(shù)必須是指向具有足夠空間的陣列的指針)。與%s和%[不同,不會將空字符追加到數(shù)組。N / AN / A char * wchar_t * N / AN / AN / AN / AN / A與非空白字符序列(字符串)匹配如果使用寬度說明符,則匹配寬度或直到第一個空白字符,以先出現(xiàn)者為準(zhǔn)。除了匹配的字符外,總是存儲一個空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個字符的空間)。集匹配字符集中的非空字符序列。如果該集合的第一個字符是^,則不匹配該集合中的所有字符。如果該集合以]或^]開頭,則該字符也包含在集合中。它是實現(xiàn)定義的,字符 - 在掃描集中的非初始位置可以指示一個范圍,如0-9。如果使用寬度說明符,則只匹配寬度。除了匹配的字符外,總是存儲一個空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個字符的空間)。d匹配一個十進(jìn)制整數(shù)。數(shù)字的格式與strtol()預(yù)期的相同,基本參數(shù)的值為10。有符號字符*或無符號字符*有符號短符號*或無符號短符號*有符號整數(shù)*或無符號整數(shù)*有符號長符號*無符號長符號*長符號*長符號或無符號長符號* intmax_t *或uintmax_t * size_t * ptrdiff_t * N / A i匹配一個整數(shù)。數(shù)字的格式與strtol()所預(yù)期的相同,基本參數(shù)的值為0(基數(shù)由解析的第一個字符決定)。你匹配一個無符號的十進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為10。o匹配一個無符號的八進(jìn)制整數(shù)。數(shù)字的格式與strtoul()所預(yù)期的基本參數(shù)的值為8相同。x,X匹配一個無符號的十六進(jìn)制整數(shù)。數(shù)字的格式與strtoul()預(yù)期的基本參數(shù)的值為16相同。n返回到目前為止讀取的字符數(shù)。沒有輸入被消耗。不增加分配計數(shù)。如果說明符具有定義的分配抑制運算符,則行為是未定義的。a,A(C99)e,E f,F(xiàn) g,G匹配一個浮點數(shù)。數(shù)字的格式與strtof()的預(yù)期相同。N / AN / A float * double * N / AN / AN / AN / long long double * p匹配定義指針的實現(xiàn)定義字符序列。printf系列函數(shù)應(yīng)該使用%p格式說明符產(chǎn)生相同的序列。N / AN / A void ** N / AN / AN / AN / AN / AN / A對于除n以外的每個轉(zhuǎn)換說明符,輸入字符的最長序列不超過任何指定的字段寬度,并且或者正是轉(zhuǎn)換說明符所期望的或者是期望的序列的前綴,是從流中消耗的東西。在消耗序列之后的第一個字符(如果有的話)仍然未讀。如果消耗的序列長度為零或消費的序列無法如上所述進(jìn)行轉(zhuǎn)換,則會發(fā)生匹配失敗,除非文件結(jié)束,編碼錯誤或讀取錯誤阻止來自流的輸入,在這種情況下,它是輸入失敗。在嘗試解析輸入之前,除[,c和n之外的所有轉(zhuǎn)換說明符都會消耗并放棄所有前導(dǎo)空白字符(通過調(diào)用isspace確定)。這些消耗的字符不會計入指定的最大字段寬度。轉(zhuǎn)換說明符lc,ls和l [執(zhí)行多字節(jié)到寬字符轉(zhuǎn)換,就好像通過調(diào)用mbrtowc(),并在轉(zhuǎn)換第一個字符之前將mbstate_t對象初始化為零。轉(zhuǎn)換說明符s和[除了匹配的字符外,總是存儲空終止符。目標(biāo)數(shù)組的大小必須至少比指定的字段寬度大1。使用%s或%[,不指定目標(biāo)數(shù)組大小,與get一樣不安全。固定寬度整數(shù)類型(int8_t等)的正確轉(zhuǎn)換規(guī)范在標(biāo)頭<inttypes.h>中定義(盡管SCNdMAX,SCNuMAX等與%jd,%ju等同義)。每個轉(zhuǎn)換說明符的操作之后都有一個序列點; 這允許將多個字段存儲在相同的“匯”變量中。當(dāng)解析一個不帶數(shù)字的指數(shù)結(jié)束的不完整浮點值時,例如用轉(zhuǎn)換說明符%f解析“100er”時,會消耗序列“100e”(可能有效的浮點數(shù)的最長前綴) ,導(dǎo)致匹配錯誤(消耗的序列不能轉(zhuǎn)換為浮點數(shù)),并保留“r”?,F(xiàn)有的實現(xiàn)不遵循這個規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯誤1765。導(dǎo)致匹配錯誤(消耗的序列不能轉(zhuǎn)換為浮點數(shù)),并保留“r”?,F(xiàn)有的實現(xiàn)不遵循這個規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯誤1765。導(dǎo)致匹配錯誤(消耗的序列不能轉(zhuǎn)換為浮點數(shù)),并保留“r”?,F(xiàn)有的實現(xiàn)不遵循這個規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯誤1765。 | 轉(zhuǎn)換說明符 | 說明 | 參數(shù)類型 | 長度修飾符 | hh(C99)。 | H | (沒有) | 升 | (C99)。 | j(C99)。 | 來自(C99)。 | t(C99)。 | 該 | % | 匹配文字% | N / A | N / A | N / A | N / A | N / A | N / A | N / A | N / A | N / A | C | 匹配一個字符或一系列字符如果使用了寬度說明符,則完全匹配寬度字符(參數(shù)必須是指向具有足夠空間的數(shù)組的指針)。與%s和%[不同,不會將空字符追加到數(shù)組。 | N / A | N / A | 字符* | wchar_t的* | N / A | N / A | N / A | N / A | N / A | 小號 | 匹配非空白字符序列(字符串)如果使用寬度說明符,則匹配寬度或直到第一個空白字符(以先出現(xiàn)者為準(zhǔn))。除了匹配的字符外,總是存儲一個空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個字符的空間)。 | 組 | matches a non-empty sequence of character from set of characters. If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set. It is implementation-defined whether the character - in the non-initial position in the scanset may be indicating a range, as in 0-9. If width specifier is used, matches only up to width. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters). | d | matches a decimal integer. The format of the number is the same as expected by strtol() with the value 10 for the base argument. | signed char* or unsigned char* | signed short* or unsigned short* | signed int* or unsigned int* | signed long* or unsigned long* | signed long long* or unsigned long long* | intmax_t* or uintmax_t* | size_t* | ptrdiff_t* | N/A | i | matches an integer. The format of the number is the same as expected by strtol() with the value 0 for the base argument (base is determined by the first characters parsed). | u | matches an unsigned decimal integer. The format of the number is the same as expected by strtoul() with the value 10 for the base argument. | o | matches an unsigned octal integer. The format of the number is the same as expected by strtoul() with the value 8 for the base argument. | x, X | matches an unsigned hexadecimal integer. The format of the number is the same as expected by strtoul() with the value 16 for the base argument. | n | returns the number of characters read so far. No input is consumed. Does not increment the assignment count. If the specifier has assignment-suppressing operator defined, the behavior is undefined. | a,A(C99)e,E f,F(xiàn) g,G | 匹配一個浮點數(shù)。數(shù)字的格式與strtof()的預(yù)期相同。 | N / A | N / A | 浮動* | 雙* | N / A | N / A | N / A | N / A | 長雙* | p | 匹配定義指針的實現(xiàn)定義的字符序列。printf系列函數(shù)應(yīng)該使用%p格式說明符產(chǎn)生相同的序列。 | N / A | N / A | 無效** | N / A | N / A | N / A | N / A | N / A | N / A |
轉(zhuǎn)換說明符 | 說明 | 參數(shù)類型 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
長度修飾符 | hh(C99)。 | H | (沒有) | 升 | (C99)。 | j(C99)。 | 來自(C99)。 | t(C99)。 | 該 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
% | 匹配文字% | N / A | N / A | N / A | N / A | N / A | N / A | N / A | N / A | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
C | 匹配一個字符或一系列字符如果使用了寬度說明符,則完全匹配寬度字符(參數(shù)必須是指向具有足夠空間的數(shù)組的指針)。與%s和%[不同,不會將空字符追加到數(shù)組。 | N / A | N / A | 字符* | wchar_t的* | N / A | N / A | N / A | N / A | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小號 | 匹配非空白字符序列(字符串)如果使用寬度說明符,則匹配寬度或直到第一個空白字符(以先出現(xiàn)者為準(zhǔn))。除了匹配的字符外,總是存儲一個空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個字符的空間)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
組 | 匹配一組字符中的非空字符序列。如果該集合的第一個字符是^,則不匹配該集合中的所有字符。如果該集合以]或^]開頭,則該字符也包含在集合中。它是實現(xiàn)定義的,字符 - 在掃描集中的非初始位置可以指示范圍,如0-9。如果使用寬度說明符,則只匹配寬度。除了匹配的字符外,總是存儲一個空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個字符的空間)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
d | 匹配一個十進(jìn)制整數(shù)。數(shù)字的格式與strtol()所預(yù)期的相同,基本參數(shù)的值為10。 | signed char *或unsigned char * | 簽署短*或無符號短* | 有符號int *或unsigned int * | 簽署長*或無符號長* | 簽署長長*或無符號長長* | intmax_t *或uintmax_t * | 為size_t * | ptrdiff_t的* | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一世 | 匹配一個整數(shù)。數(shù)字的格式與strtol()所期望的相同,基本參數(shù)的值為0(基數(shù)由解析的第一個字符決定)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在 | 匹配一個無符號的十進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為10。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
該 | 匹配一個無符號的八進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為8。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
x,X | 匹配一個無符號的十六進(jìn)制整數(shù)。數(shù)字的格式與strtoul()預(yù)期的基本參數(shù)的值為16相同。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? | 返回迄今閱讀的字符數(shù)。沒有輸入被消耗。不增加分配計數(shù)。如果說明符具有定義的分配抑制運算符,則行為是未定義的。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a,A(C99)e,E f,F(xiàn) g,G | 匹配一個浮點數(shù)。數(shù)字的格式與strtof()的預(yù)期相同。 | N / A | N / A | 浮動* | 雙* | N / A | N / A | N / A | N / A | 長雙* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
p | 匹配定義指針的實現(xiàn)定義的字符序列。printf系列函數(shù)應(yīng)該使用%p格式說明符產(chǎn)生相同的序列。 | N / A | N / A | 無效** | N / A | N / A | N / A | N / A | N / A | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VLIST | - | 包含接收參數(shù)的變量參數(shù)列表 |
1-3)成功分配的接收參數(shù)數(shù)目,或者EOF
在分配第一個接收參數(shù)前發(fā)生讀取失敗。
4-6)與(1-3)相同,但是EOF
如果存在運行時約束沖突,也會返回。
所有這些函數(shù)va_arg
至少調(diào)用一次,arg
返回后的值是不確定的。這些函數(shù)不會調(diào)用va_end
,并且它必須由調(diào)用者完成。
#include <stdio.h>#include <stdbool.h>#include <stdarg.h> bool checked_sscanf(int count, const char* buf, const char *fmt, ...){ va_list ap; va_start(ap, fmt); int rc = vsscanf(buf, fmt, ap); va_end(ap); return rc == count;} int main(void){ int n, m; printf("Parsing '1 2'..."); if(checked_sscanf(2, "1 2", "%d %d", &n, &m)) puts("success"); else puts("failure"); printf("Parsing '1 a'..."); if(checked_sscanf(2, "1 a", "%d %d", &n, &m)) puts("success"); else puts("failure");}
輸出:
Parsing '1 2'...success Parsing '1 a'...failure