共用方式為


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

注意

hchar別 的數據類型搭配使用時,、 lL 前置詞是Microsoft擴充功能。

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