scanf
寬度規格
下列資訊適用於任何 scanf
函式系列中的格式字串解譯,包含安全版本,例如 scanf_s
。 這些函式通常會假設輸入資料流分割成一連串的語彙基元。 標記會以空格元(空格、製表元或換行符)或數值型別分隔,以數值數據類型的自然結尾分隔,如無法轉換成數值文字的第一個字元所表示。 不過,寬度規格可能會用來造成輸入剖析在語彙基元自然結束之前停止。
規格 width
包含 與類型欄位規範之間的 %
字元,其中可能包含稱為 width
欄位的正整數,以及一或多個字元,指出欄位的大小,這也可以視為字段類型的修飾詞,例如整數類型 short
為 或 long
的指示。 此類字元稱為大小前置詞。
欄位width
欄位 width
是正十進位整數,可控制要讀取該欄位的最大字元數。 width
不會超過字元會轉換並儲存在對應的 argument
中。 如果空格元或無法根據指定格式轉換的字元在到達之前width
發生,則可能會讀取少於width
字元。
寬度規格與這些函式安全版本所需的緩衝區大小自變數不同(例如、 scanf_s
、 wscanf_s
等等)。 在下列範例中,寬度規格為 20,表示會從輸入資料流讀取最多 20 個字元。 緩衝區長度為 21,其中包含可能的 20 個字元再加上 null 結束字元的空間:
char str[21];
scanf_s("%20s", str, 21);
width
如果未使用欄位,scanf_s
會嘗試將整個令牌讀取到字串中。 如果指定的大小不夠大,無法保存整個令牌,則不會寫入目的地字串。 width
如果指定欄位,則令牌中的第一個字元width
會連同 Null 終止符一起寫入目的地字串。
大小前置詞
選擇性前置詞 h
、hh
、、、I64
l
ll
、 和 L
會根據所修改的類型argument
字元,指出 (long 或 short、single-byte 字元或寬字元) 的大小。 這些格式規格字元會搭配 scanf
或 wscanf
函式中的型別字元使用,以便指定引數的解譯,如下方表格所示。 類型前置詞 I64
是Microsoft延伸模組,與標準 C 不相容。類型字元及其意義會在類型字段字元的 scanf
「scanf 函式類型字元」數據表中描述。
注意
與 h
型char
別 的數據類型搭配使用時,、 l
和 L
前置詞是Microsoft擴充功能。
和wscanf
格式類型規範的大小scanf
前置詞
若要指定 | 使用前置詞 | 類型規範為 |
---|---|---|
double |
l |
e 、E 、f 、g 或 G |
long double (與 double 相同) |
L |
e 、E 、f 、g 或 G |
long int |
l |
d 、i 、o 、x 或 X |
long unsigned int |
l |
u |
long long |
ll |
d 、i 、o 、x 或 X |
short int |
h |
d 、i 、o 、x 或 X |
short unsigned int |
h |
u |
char |
hh |
d 、i 、o 、x 或 X |
unsigned char |
hh |
u |
int64 |
I64 |
d 、i 、o 、u 、x 或 X |
使用 scanf 的單一位元組字元 |
h |
c 或 C |
使用 wscanf 的單一位元組字元 |
h |
c 或 C |
使用 scanf 的寬字元 |
l |
c 或 C |
使用 wscanf 的寬字元 |
l |
c ,或C |
使用的單一位元組字元串 scanf |
h |
s 或 S |
使用的單一位元組字元串 wscanf |
h |
s 或 S |
具有的寬字元字串 scanf |
l |
s 或 S |
具有的寬字元字串 wscanf |
l |
s 或 S |
下列範例使用 h
和 搭配函scanf_s
式和wscanf_s
函l
式:
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
如果使用 scanf
系列中的不安全函式,則會省略指出先前引數緩衝區長度的大小參數。
讀取未匯入的字串
若要讀取未以空格符分隔的字串,括號 ([ ]
) 中的一組字元可以取代 s
為 (string) 類型字元。 括號中的字元集稱為 控制字串。 對應的輸入欄位會讀取到控件字串中未出現的第一個字元。 如果集合中的第一個字元是插入號 (^
),則會產生相反效果,即輸入欄位會讀取至剩餘字元集中出現的第一個字元。
與 %[z-a]
都會%[a-z]
解譯為與 %[abcde...z]
相等的 。 這是常見的 scanf
函式延伸模組,但標準 C 不需要。
讀取未結束的字串
若要儲存字串而不儲存終止的 Null 字元 ('\0'),請使用規格 %Nc
,其中 N 是十進位整數。 在此情況下, c
類型字元表示自變數是字元陣列的指標。 接下來 的 N 個字元會從輸入數據流讀取到指定的位置,而且不會附加任何 Null 字元 ('\0')。 如果未 指定 N ,則其預設值為 1。
停止讀取欄位時scanf
scanf
函式會逐個字元掃描每個輸入欄位。 它可能會在到達空白字元之前停止讀取特定輸入欄位,原因有數個:
已達到指定的寬度。
無法如指定轉換下一個字元。
下一個字元與控件字串中應該相符的字元衝突。
下一個字元無法顯示在指定的字元集。
無論基於任何原因,當 scanf
函式停止讀取輸入欄位時,下一個輸入欄位會視為以未讀取的第一個字元開始。 如果有的話,衝突字元會被視為未讀取。 這是下一個輸入欄位的第一個字元,或輸入數據流上後續讀取作業中的第一個字元。
另請參閱
scanf
、 、 _scanf_l
、 wscanf
_wscanf_l
scanf_s
、 、 _scanf_s_l
、 wscanf_s
_wscanf_s_l
格式規格欄位: scanf
和 wscanf
函式
scanf
類型欄位字元