?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
在頭文件<stdio.h>中定義 | ||
---|---|---|
(1) | ||
int scanf(const char * format,...); | (直到C99) | |
int scanf(const char * restrict format,...); | (自C99以來(lái)) | |
(2) | ||
int fscanf(FILE * stream,const char * format,...); | (直到C99) | |
int fscanf(FILE * restrict stream,const char * restrict format,...); | (自C99以來(lái)) | |
(3) | ||
int sscanf(const char * buffer,const char * format,...); | (直到C99) | |
int sscanf(const char *限制緩沖區(qū),const char *限制格式,...); | (自C99以來(lái)) | |
int scanf_s(const char * restrict format,...); | (4) | (自C11以來(lái)) |
int fscanf_s(FILE * restrict stream,const char * restrict format,...); | (5) | (自C11以來(lái)) |
int sscanf_s(const char *限制緩沖區(qū),const char *限制格式,...); | (6) | (自C11以來(lái)) |
從各種來(lái)源讀取數(shù)據(jù),根據(jù)其解釋并將format
結(jié)果存儲(chǔ)到給定位置。
1)從中讀取數(shù)據(jù) stdin
2)從文件流中讀取數(shù)據(jù) stream
3)從空終止的字符串中讀取數(shù)據(jù)buffer
。到達(dá)字符串的末尾等同于達(dá)到文件結(jié)束條件fscanf
4-6)與(1-3)相同,不同之處在于%c
,%s
和%[
轉(zhuǎn)換說(shuō)明符每個(gè)都需要兩個(gè)參數(shù)(通常的指針和rsize_t
表示接收數(shù)組大小的類(lèi)型值,當(dāng)使用%c讀取時(shí)可能為1成一個(gè)字符),除了在運(yùn)行時(shí)檢測(cè)到以下錯(cuò)誤并調(diào)用當(dāng)前安裝的約束處理函數(shù):
指針類(lèi)型的任何參數(shù)都是空指針
format
,stream
或者buffer
是空指針
%c,%s或%[,加上終止空字符,將會(huì)超過(guò)為每個(gè)轉(zhuǎn)換說(shuō)明符提供的第二個(gè)(rsize_t)參數(shù)所寫(xiě)的字符數(shù)
可選地,還有任何其他可檢測(cè)到的錯(cuò)誤,例如未知的轉(zhuǎn)換說(shuō)明符
由于所有的邊界檢查功能,scanf_s
,fscanf_s
,和sscanf_s
僅保證可供如果__STDC_LIB_EXT1__
由實(shí)現(xiàn)所定義,并且如果用戶定義__STDC_WANT_LIB_EXT1__
的整數(shù)常數(shù)1
,包括之前<stdio.h>
。
流 | - | 輸入文件流從中讀取 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
緩沖 | - | 指向以null結(jié)尾的字符串讀取的指針 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
格式 | - | 指向以空字符結(jié)尾的字符串的指針,指定如何讀取輸入。格式字符串由。非空白多字節(jié)字符除%以外:格式字符串中的每個(gè)這樣的字符只會(huì)從輸入流中消耗一個(gè)完全相同的字符,或者如果流中的下一個(gè)字符不相等,則會(huì)導(dǎo)致函數(shù)失敗??崭褡址焊袷阶址械娜魏螁蝹€(gè)空白字符都會(huì)消耗輸入中的所有可用連續(xù)空格字符(如同通過(guò)調(diào)用循環(huán)中的isspace一樣來(lái)確定)。請(qǐng)注意,格式字符串中的“\ n”,“”,“\ t \ t”或其他空格沒(méi)有區(qū)別。轉(zhuǎn)換規(guī)格。每個(gè)轉(zhuǎn)換規(guī)范具有以下格式:介紹%字符(可選)分配抑制字符*。如果存在此選項(xiàng),則函數(shù)不會(huì)將轉(zhuǎn)換結(jié)果分配給任何接收參數(shù)。(可選)指定最大字段寬度的整數(shù)數(shù)字(大于零),即該函數(shù)在執(zhí)行當(dāng)前轉(zhuǎn)換規(guī)范指定的轉(zhuǎn)換時(shí)允許使用的最大字符數(shù)。請(qǐng)注意,如果未提供寬度,%s和%[可能會(huì)導(dǎo)致緩沖區(qū)溢出。(可選)長(zhǎng)度修飾符,用于指定接收參數(shù)的大小,即實(shí)際的目標(biāo)類(lèi)型。這會(huì)影響轉(zhuǎn)換精度和溢出規(guī)則。每種轉(zhuǎn)換類(lèi)型的默認(rèn)目標(biāo)類(lèi)型都不相同(請(qǐng)參閱下表)。轉(zhuǎn)換格式說(shuō)明符以下格式說(shuō)明符可用:轉(zhuǎn)換說(shuō)明符說(shuō)明參數(shù)類(lèi)型長(zhǎng)度修飾符hh(C99)。h(無(wú))ll(C99)。j(C99)。z(C99)。t(C99)。L%匹配字面值%N / AN / AN / AN / AN / AN / AN / AN / AN / c與字符或字符序列匹配如果使用寬度說(shuō)明符,則匹配完全寬度字符(參數(shù)必須是指向具有足夠空間的陣列的指針)。與%s和%[不同,不會(huì)將空字符追加到數(shù)組。N / AN / A char * wchar_t * N / AN / AN / AN / AN / A與非空白字符序列(字符串)匹配如果使用寬度說(shuō)明符,則匹配寬度或直到第一個(gè)空白字符,以先出現(xiàn)者為準(zhǔn)。除了匹配的字符外,總是存儲(chǔ)一個(gè)空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個(gè)字符的空間)。集匹配字符集中的非空字符序列。如果該集合的第一個(gè)字符是^,則不匹配該集合中的所有字符。如果該集合以]或^]開(kāi)頭,則該字符也包含在集合中。它是實(shí)現(xiàn)定義的,字符 - 在掃描集中的非初始位置可以指示一個(gè)范圍,如0-9。如果使用寬度說(shuō)明符,則只匹配寬度。除了匹配的字符外,總是存儲(chǔ)一個(gè)空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個(gè)字符的空間)。d匹配一個(gè)十進(jìn)制整數(shù)。數(shù)字的格式與strtol()預(yù)期的相同,基本參數(shù)的值為10。有符號(hào)字符*或無(wú)符號(hào)字符*有符號(hào)短符號(hào)*或無(wú)符號(hào)短符號(hào)*有符號(hào)整數(shù)*或無(wú)符號(hào)整數(shù)*有符號(hào)長(zhǎng)符號(hào)*無(wú)符號(hào)長(zhǎng)符號(hào)*長(zhǎng)符號(hào)*長(zhǎng)符號(hào)或無(wú)符號(hào)長(zhǎng)符號(hào)* intmax_t *或uintmax_t * size_t * ptrdiff_t * N / A i匹配一個(gè)整數(shù)。數(shù)字的格式與strtol()所預(yù)期的相同,基本參數(shù)的值為0(基數(shù)由解析的第一個(gè)字符決定)。你匹配一個(gè)無(wú)符號(hào)的十進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為10。o匹配一個(gè)無(wú)符號(hào)的八進(jìn)制整數(shù)。數(shù)字的格式與strtoul()所預(yù)期的基本參數(shù)的值為8相同。x,X匹配一個(gè)無(wú)符號(hào)的十六進(jìn)制整數(shù)。數(shù)字的格式與strtoul()預(yù)期的基本參數(shù)的值為16相同。n返回到目前為止讀取的字符數(shù)。沒(méi)有輸入被消耗。不增加分配計(jì)數(shù)。如果說(shuō)明符具有定義的分配抑制運(yùn)算符,則行為是未定義的。a,A(C99)e,E f,F(xiàn) g,G匹配一個(gè)浮點(diǎn)數(shù)。數(shù)字的格式與strtof()的預(yù)期相同。N / AN / A float * double * N / AN / AN / AN / long long double * p匹配定義指針的實(shí)現(xiàn)定義字符序列。printf系列函數(shù)應(yīng)該使用%p格式說(shuō)明符產(chǎn)生相同的序列。N / AN / A void ** N / AN / AN / AN / AN / AN / A對(duì)于除n以外的每個(gè)轉(zhuǎn)換說(shuō)明符,輸入字符的最長(zhǎng)序列不超過(guò)任何指定的字段寬度,并且或者正是轉(zhuǎn)換說(shuō)明符所期望的或者是期望的序列的前綴,是從流中消耗的東西。在消耗序列之后的第一個(gè)字符(如果有的話)仍然未讀。如果消耗的序列長(zhǎng)度為零或消費(fèi)的序列無(wú)法如上所述進(jìn)行轉(zhuǎn)換,則會(huì)發(fā)生匹配失敗,除非文件結(jié)束,編碼錯(cuò)誤或讀取錯(cuò)誤阻止來(lái)自流的輸入,在這種情況下,它是輸入失敗。在嘗試解析輸入之前,除[,c和n之外的所有轉(zhuǎn)換說(shuō)明符都會(huì)消耗并放棄所有前導(dǎo)空白字符(通過(guò)調(diào)用isspace確定)。這些消耗的字符不會(huì)計(jì)入指定的最大字段寬度。轉(zhuǎn)換說(shuō)明符lc,ls和l [執(zhí)行多字節(jié)到寬字符轉(zhuǎn)換,就好像通過(guò)調(diào)用mbrtowc(),并在轉(zhuǎn)換第一個(gè)字符之前將mbstate_t對(duì)象初始化為零。轉(zhuǎn)換說(shuō)明符s和[除了匹配的字符外,總是存儲(chǔ)空終止符。目標(biāo)數(shù)組的大小必須至少比指定的字段寬度大1。使用%s或%[,不指定目標(biāo)數(shù)組大小,與get一樣不安全。固定寬度整數(shù)類(lèi)型(int8_t等)的正確轉(zhuǎn)換規(guī)范在標(biāo)頭<inttypes.h>中定義(盡管SCNdMAX,SCNuMAX等與%jd,%ju等同義)。每個(gè)轉(zhuǎn)換說(shuō)明符的操作之后都有一個(gè)序列點(diǎn); 這允許將多個(gè)字段存儲(chǔ)在相同的“匯”變量中。當(dāng)解析一個(gè)不帶數(shù)字的指數(shù)結(jié)束的不完整浮點(diǎn)值時(shí),例如用轉(zhuǎn)換說(shuō)明符%f解析“100er”時(shí),會(huì)消耗序列“100e”(可能有效的浮點(diǎn)數(shù)的最長(zhǎng)前綴) ,導(dǎo)致匹配錯(cuò)誤(消耗的序列不能轉(zhuǎn)換為浮點(diǎn)數(shù)),并保留“r”?,F(xiàn)有的實(shí)現(xiàn)不遵循這個(gè)規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯(cuò)誤1765。導(dǎo)致匹配錯(cuò)誤(消耗的序列不能轉(zhuǎn)換為浮點(diǎn)數(shù)),并保留“r”?,F(xiàn)有的實(shí)現(xiàn)不遵循這個(gè)規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯(cuò)誤1765。導(dǎo)致匹配錯(cuò)誤(消耗的序列不能轉(zhuǎn)換為浮點(diǎn)數(shù)),并保留“r”。現(xiàn)有的實(shí)現(xiàn)不遵循這個(gè)規(guī)則,并回滾到只消耗“100”,留下“呃”,例如glibc錯(cuò)誤1765。 | Conversion specifier | Explanation | Argument type | length modifier | hh (C99). | h | (none) | l | ll (C99). | j (C99). | z (C99). | t (C99). | L | % | matches literal % | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | c | matches a character or a sequence of characters If a width specifier is used, matches exactly width characters (the argument must be a pointer to an array with sufficient room). Unlike %s and %[, does not append the null character to the array. | N/A | N/A | char* | wchar_t* | N/A | N/A | N/A | N/A | N/A | s | matches a sequence of non-whitespace characters (a string) If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters). | set | 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 g, G | matches a floating-point number. The format of the number is the same as expected by strtof(). | N/A | N/A | float* | double* | N/A | N/A | N/A | N/A | long double* | p | matches implementation defined character sequence defining a pointer. printf family of functions should produce the same sequence using %p format specifier. | N/A | N/A | void** | N/A | N/A | N/A | N/A | N/A | N/A |
Conversion specifier | Explanation | Argument type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
length modifier | hh (C99). | h | (none) | l | ll (C99). | j (C99). | z (C99). | t (C99). | L | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
% | matches literal % | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c | matches a character or a sequence of characters If a width specifier is used, matches exactly width characters (the argument must be a pointer to an array with sufficient room). Unlike %s and %[, does not append the null character to the array. | N/A | N/A | char* | wchar_t* | N/A | N/A | N/A | N/A | N/A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
s | matches a sequence of non-whitespace characters (a string) If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set | 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 *或uintmax_t * | 為size_t * | ptrdiff_t的* | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一世 | 匹配一個(gè)整數(shù)。數(shù)字的格式與strtol()所期望的相同,基本參數(shù)的值為0(基數(shù)由解析的第一個(gè)字符決定)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在 | 匹配一個(gè)無(wú)符號(hào)的十進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為10。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
該 | 匹配一個(gè)無(wú)符號(hào)的八進(jìn)制整數(shù)。數(shù)字的格式與strtoul()的預(yù)期相同,基本參數(shù)的值為8。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
x,X | 匹配一個(gè)無(wú)符號(hào)的十六進(jìn)制整數(shù)。數(shù)字的格式與strtoul()預(yù)期的基本參數(shù)的值為16相同。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? | 返回迄今閱讀的字符數(shù)。沒(méi)有輸入被消耗。不增加分配計(jì)數(shù)。如果說(shuō)明符具有定義的分配抑制運(yùn)算符,則行為是未定義的。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a,A(C99)e,E f,F(xiàn) g,G | 匹配一個(gè)浮點(diǎn)數(shù)。數(shù)字的格式與strtof()的預(yù)期相同。 | N / A | N / A | 浮動(dòng)* | 雙* | N / A | N / A | N / A | N / A | 長(zhǎng)雙* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
p | 匹配定義指針的實(shí)現(xiàn)定義的字符序列。printf系列函數(shù)應(yīng)該使用%p格式說(shuō)明符產(chǎn)生相同的序列。 | N / A | N / A | 無(wú)效** | N / A | N / A | N / A | N / A | N / A | N / A | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 接收參數(shù) |
非空白多字節(jié)字符除外%
:格式字符串中的每個(gè)這樣的字符只消耗輸入流中的一個(gè)完全相同的字符,或者如果流中的下一個(gè)字符不相等,則會(huì)導(dǎo)致函數(shù)失敗。
空白字符:格式字符串中的任何單個(gè)空白字符都會(huì)消耗輸入中所有可用的連續(xù)空白字符(如同通過(guò)調(diào)用isspace
循環(huán)來(lái)確定)。請(qǐng)注意,有沒(méi)有什么區(qū)別"\n"
," "
,"\t\t"
在格式字符串或其他空白。
轉(zhuǎn)換規(guī)格。每個(gè)轉(zhuǎn)換規(guī)范具有以下格式:
介紹%
人物
(可選)分配抑制字符*
。如果存在此選項(xiàng),則函數(shù)不會(huì)將轉(zhuǎn)換結(jié)果分配給任何接收參數(shù)。
(可選)指定最大字段寬度的整數(shù)數(shù)字(大于零),即該函數(shù)在執(zhí)行由當(dāng)前轉(zhuǎn)換規(guī)范指定的轉(zhuǎn)換時(shí)允許使用的最大字符數(shù)。請(qǐng)注意,如果未提供寬度,%s和%[可能會(huì)導(dǎo)致緩沖區(qū)溢出。
(可選)長(zhǎng)度修飾符,用于指定接收參數(shù)的大小,即實(shí)際的目標(biāo)類(lèi)型。這會(huì)影響轉(zhuǎn)換精度和溢出規(guī)則。每種轉(zhuǎn)換類(lèi)型的默認(rèn)目標(biāo)類(lèi)型都不相同(請(qǐng)參閱下表)。
轉(zhuǎn)換格式說(shuō)明符
以下格式說(shuō)明符可用:
Conversion
說(shuō)明符說(shuō)明參數(shù)類(lèi)型長(zhǎng)度修飾符 hh
(C99)。
h
(none) l
ll
(C99).
j
(C99).
z
(C99).
t
(C99).
L
%
匹配字面%
N / AN / AN / AN / AN / AN / AN / AN / AN / A c
一個(gè)匹配字符或序列字符如果使用寬度說(shuō)明,完全匹配寬度的字符(參數(shù)必須是一個(gè)指針數(shù)組有足夠的空間)。與%s和%[不同,不會(huì)將空字符追加到數(shù)組。
N/A N/A char*
wchar_t*
N / AN / AN / AN / AN / A s
匹配非空白字符序列(字符串)如果使用寬度說(shuō)明符,則匹配寬度或直到第一個(gè)空白字符,以先出現(xiàn)者為準(zhǔn)。除了匹配的字符外,總是存儲(chǔ)一個(gè)空字符(所以參數(shù)數(shù)組必須至少有寬度+ 1個(gè)字符的空間)。
`[`set`]` 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()`](../string/byte/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`](../types/integer)`*` or [`uintmax_t`](../types/integer)`*`
size_t*
ptrdiff_t*
N / A i
匹配整數(shù)。數(shù)的格式是相同的通過(guò)按預(yù)期strtol()
與值0
的base
參數(shù)(基部由解析的第一字符確定)。
`u` matches an unsigned **decimal integer**. The format of the number is the same as expected by [`strtoul()`](../string/byte/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()`](../string/byte/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()`](../string/byte/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
g
,G
匹配一個(gè)浮點(diǎn)數(shù)。數(shù)字的格式與預(yù)期的相同strtof()
。
N/A N/A float*
double*
N/A N/A N/A N/A long double*
`p` matches implementation defined character sequence defining a **pointer**. `printf` family of functions should produce the same sequence using `%p` format specifier.
N/A N/A void**
n
不適用不適用不適用不適用不適用不適用不適用不適用于任何指定字段寬度的最長(zhǎng)輸入字符序列的 每個(gè)轉(zhuǎn)換說(shuō)明符,或者正是轉(zhuǎn)換說(shuō)明符所期望的或者是它期望的順序是從流中消耗的。在消耗序列之后的第一個(gè)字符(如果有的話)仍然未讀。如果消耗的序列長(zhǎng)度為零或消費(fèi)的序列不能如上所述進(jìn)行轉(zhuǎn)換,則會(huì)發(fā)生匹配失敗,除非文件結(jié)束,編碼錯(cuò)誤或讀取錯(cuò)誤阻止了來(lái)自流的輸入,在這種情況下,它是輸入失敗。
在嘗試解析輸入之前,除了[
,,之外的所有轉(zhuǎn)換說(shuō)明符都會(huì)消耗并放棄所有前導(dǎo)空白字符(如同通過(guò)調(diào)用一樣確定)。這些消耗的字符不會(huì)計(jì)入指定的最大字段寬度。cnisspace
轉(zhuǎn)換說(shuō)明符lc
,ls
并l[
執(zhí)行多字節(jié)到寬字符轉(zhuǎn)換,就好像通過(guò)在第一個(gè)字符轉(zhuǎn)換之前使用初始化為零mbrtowc()
的mbstate_t
對(duì)象調(diào)用一樣。
除了匹配的字符之外,轉(zhuǎn)換說(shuō)明符s
并[
始終存儲(chǔ)空終止符。目標(biāo)數(shù)組的大小必須至少比指定的字段寬度大1。在不指定目標(biāo)數(shù)組大小的情況下,使用%s
或%[
不安全gets
。
對(duì)于固定寬度的整數(shù)類(lèi)型(正確的轉(zhuǎn)換規(guī)格int8_t
<inttypes.h>還(雖然,等等)都在頭定義SCNdMAX
,SCNuMAX
等是同義詞%jd
,%ju
等)。
每個(gè)轉(zhuǎn)換說(shuō)明符的操作之后都有一個(gè)序列點(diǎn); 這允許將多個(gè)字段存儲(chǔ)在相同的“匯”變量中。
在解析指數(shù)中不包含數(shù)字的不完整浮點(diǎn)值時(shí)(例如"100er"
使用轉(zhuǎn)換說(shuō)明符進(jìn)行解析),會(huì)消耗%f
序列"100e"
(可能有效的浮點(diǎn)數(shù)的最長(zhǎng)前綴),從而導(dǎo)致匹配錯(cuò)誤(消耗的序列不能轉(zhuǎn)換為浮點(diǎn)數(shù)),"r"
剩余的?,F(xiàn)有的實(shí)現(xiàn)不遵循此規(guī)則并僅回滾消耗"100"
,只留下"er"
例如glibc錯(cuò)誤1765。
... - receiving arguments
1-3)成功分配的接收參數(shù)數(shù)量(EOF
如果在分配第一個(gè)接收參數(shù)之前發(fā)生匹配故障,則可能為零),或者在分配第一個(gè)接收參數(shù)前發(fā)生輸入故障。
4-6)與(1-3)相同,但是EOF
如果存在運(yùn)行時(shí)約束沖突,也會(huì)返回。
由于大多數(shù)轉(zhuǎn)換說(shuō)明符首先消耗所有連續(xù)的空白,所以代碼如。
scanf("%d", &a);scanf("%d", &b);
將讀取在不同行上輸入的兩個(gè)整數(shù)(第二個(gè)%d將使用第一個(gè)剩下的換行符)或在同一行上,由空格或制表符分隔(第二個(gè)%d將使用空格或制表符)。不使用前導(dǎo)空格的轉(zhuǎn)換說(shuō)明符(如%c)可以通過(guò)在格式字符串中使用空格字符來(lái)完成:
scanf("%d", &a);scanf(" %c", &c); // ignore the endline after %d, then read a char
#define __STDC_WANT_LIB_EXT1__ 1#include <stdio.h>#include <stddef.h>#include <locale.h> int main(void){ int i, j; float x, y; char str1[10], str2[4]; wchar_t warr[2]; setlocale(LC_ALL, "en_US.utf8"); char input[] = "25 54.32E-1 Thompson 56789 0123 56?水"; /* parse as follows: %d: an integer %f: a floating-point value %9s: a string of at most 9 non-whitespace characters %2d: two-digit integer (digits 5 and 6) %f: a floating-point value (digits 7, 8, 9) %*d: an integer which isn't stored anywhere ' ': all consecutive whitespace %3[0-9]: a string of at most 3 decimal digits (digits 5 and 6) %2lc: two wide characters, using multibyte to wide conversion */ int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc", &i, &x, str1, &j, &y, str2, warr); printf("Converted %d fields:\ni = %d\nx = %f\nstr1 = %s\n" "j = %d\ny = %f\nstr2 = %s\n" "warr[0] = U+%x warr[1] = U+%x\n", ret, i, x, str1, j, y, str2, warr[0], warr[1]); #ifdef __STDC_LIB_EXT1__ int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1); // writes 25 to i, 5.432 to x, the 9 bytes "thompson\0" to str1, and 3 to n.#endif}
輸出:
Converted 7 fields:i = 25x = 5.432000str1 = Thompson j = 56y = 789.000000str2 = 56warr[0] = U+df warr[1] = U+6c34
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.21.6.2 fscanf函數(shù)(p:317-324)
7.21.6.4 scanf函數(shù)(p:325)
7.21.6.7 sscanf函數(shù)(p:326)
K.3.5.3.2 fscanf_s函數(shù)(p:592-593)
K.3.5.3.4 scanf_s函數(shù)(p:594)
K.3.5.3.7 sscanf_s函數(shù)(p:596)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.19.6.2 fscanf函數(shù)(p:282-289)
7.19.6.4 scanf函數(shù)(p:290)
7.19.6.7 sscanf函數(shù)(p:291)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.9.6.2 fscanf函數(shù)
4.9.6.4 scanf函數(shù)
4.9.6.6 sscanf函數(shù)