Share via


scanf 寬度規格

下列資訊適用於任何 scanf 函式系列中的格式字串解譯,包含安全版本,例如 scanf_s。 這些函式通常會假設輸入資料流分割成一連串的語彙基元。 標記會以空白字元(空格、定位字元或分行符號)或數值型別分隔,以數值資料類型的自然結尾分隔,如無法轉換成數值文字的第一個字元所表示。 不過,寬度規格可能會用來造成輸入剖析在語彙基元自然結束之前停止。

規格 width 包含 與 類型欄位規範之間的 % 字元,其中可能包含稱為 width 欄位的正整數,以及一或多個字元,指出欄位的大小,這也可以視為欄位類型的修飾詞,例如整數類型 short 為 或 long 的指示。 此類字元稱為大小前置詞。

欄位 width

欄位 width 是正十進位整數,可控制要讀取該欄位的最大字元數。 width不會超過字元會轉換並儲存在對應的 argument 中。 如果空白字元或無法根據指定格式轉換的字元在到達之前 width 發生,則可能會讀取少於 width 字元。

寬度規格與這些函式安全版本所需的緩衝區大小引數不同(例如、 scanf_swscanf_s 等等)。 在下列範例中,寬度規格為 20,表示會從輸入資料流讀取最多 20 個字元。 緩衝區長度為 21,其中包含可能的 20 個字元再加上 null 結束字元的空間:

char str[21];
scanf_s("%20s", str, 21);

width如果未使用欄位, scanf_s 會嘗試將整個權杖讀取到字串中。 如果指定的大小不夠大,無法保存整個權杖,則不會寫入目的地字串。 width如果指定欄位,則權杖中的第一個字元 width 會連同 Null 結束字元一起寫入目的地字串。

大小前置詞

選擇性前置詞 hhh 、、 lllI64 、 和 L 會根據所修改的類型 argument 字元,指出 (long 或 short、single-byte 字元或寬字元) 的大小。 這些格式規格字元會搭配 scanfwscanf 函式中的型別字元使用,以便指定引數的解譯,如下方表格所示。 類型前置詞 I64 是 Microsoft 延伸模組,與標準 C 不相容。類型字元及其意義會在類型欄位字元的 scanf 「scanf 函式類型字元 」資料表中描述。

注意

hlL 前置詞是 Microsoft 擴充功能,當搭配 類型 char 的資料使用時。

wscanf 格式類型規範的大小 scanf 前置詞

若要指定 使用前置詞 類型規範為
double l eEfgG
long double (與 double 相同) L eEfgG
long int l dioxX
long unsigned int l u
long long ll dioxX
short int h dioxX
short unsigned int h u
char hh dioxX
unsigned char hh u
int64 I64 diouxX
使用 scanf 的單一位元組字元 h cC
使用 wscanf 的單一位元組字元 h cC
使用 scanf 的寬字元 l cC
使用 wscanf 的寬字元 l c,或C
使用 的單一位元組字元字串 scanf h sS
使用 的單一位元組字元字串 wscanf h sS
具有 的寬字元字串 scanf l sS
具有 的寬字元字串 wscanf l sS

下列範例使用 h 和 搭配函 scanf_s 式和 wscanf_sl 式:

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
格式規格欄位: scanfwscanf 函式
scanf 類型欄位字元