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
、、 l
ll
、 I64
、 和 L
會根據所修改的類型 argument
字元,指出 (long 或 short、single-byte 字元或寬字元) 的大小。 這些格式規格字元會搭配 scanf
或 wscanf
函式中的型別字元使用,以便指定引數的解譯,如下方表格所示。 類型前置詞 I64
是 Microsoft 延伸模組,與標準 C 不相容。類型字元及其意義會在類型欄位字元的 scanf
「scanf 函式類型字元 」資料表中描述。
注意
、 h
l
和 L
前置詞是 Microsoft 擴充功能,當搭配 類型 char
的資料使用時。
和 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
類型欄位字元
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應