scanf 寬度規格
這份資訊同時適用格式字串的說明函式系列的 scanf ,包含安全性版本 (例如 scanf_s)。 這些函式通常假設輸入資料流分割成語彙基元序列。 語彙基元分隔由空白字元 (空白字元、定位字元或新行字元) 在數字型別,在此情況下,或者,由數值資料型別的自然結尾如所無法轉換為數字文字的第一個字元。 然而,寬度規格可能用來建立項目的剖析在語彙基元的自然結束前停止。
寬度 規格所包含之 % 和型別欄位規範之間的字元,其中可能包含呼叫表示欄位的寬度欄位和一或多個字元的正整數,可能也會被視為欄位的型別修飾詞,例如表示整數型別是否為 short 或 long。 這類字元稱為大小前置詞。
寬度欄位
欄位寬度是控制字元的最大數目正十進位整數會讀取為該欄位。 沒有超過 寬 字元會轉換並儲存在對應的 argument。 小於 寬度 字元可能會無法以特定格式轉換的空白字元 (空白字元、定位字元或新行字元) 或字元,是否會發生在 寬度 之前。
寬度規格從安全版本所需的緩衝區大小引數是不同和不同的這些函式 (例如, scanf_s、 wscanf_s等)。在下列範例中,寬度規格是 20,表示 20 表示輸入資料流讀取。 緩衝區的長度為 21,包括可能的 20 個字元的空間加上 null 結束字元:
char str[21];
scanf_s("%20s", str, 21);
如果沒有使用欄位寬度, scanf_s 會嘗試讀取整個輸入字串語彙基元。 如果指定的大小不足以容納整個語彙基元,則寫入目的字串不會被覆寫。 如果 寬度 欄位指定,則在此語彙基元的第一個 寬 字元寫入目的資料要以 null 結束字元。
大小前置
選擇性前置 h、 l、 ll, I64和 L 指示 argument 的大小 (長或短,單一位元組字元或寬字元,根據修改) 的型別字元。 如下表所示,這些格式規範字元來與型別字元在 scanf 或 wscanf 函式指定引數的說明。 這個型別前置 I64 是 Microsoft 擴充功能不是 ANSI 相容。 型別字元及其意義在 scanf 類型欄位字元中的 「 scanf 函式的型別字元」資料表中所述。
注意事項 |
---|
h和 l和 L 前置詞是 Microsoft 擴充功能,當搭配 char型別的資料。 |
調整 scanf 和 wscanf 格式的型別規範的前置詞。
若要指定 |
使用前置詞 |
型別規範 |
---|---|---|
double |
l |
e和 E和 f、 g或 G |
long 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 |
__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 |
與 scanf_s 函式和 wscanf_s 函式的範例使用 h 和 l :
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
如果使用一 unsecure 函式在 scanf 家族,請省略表示上述引數的緩衝區長度的大小參數。
讀取 Undelimited 字串
若要讀取字串不為空白字元分隔,一個括弧 ([ ]) 的字元可以用 s (字串) 型別字元被取代。 一組方括弧中的字元指控制字串。 對應的輸入欄位讀取由未出現在控制項中字串的第一個字元。 如果在這個集合中的第一個字元是插入號 (^),效果相反:輸入欄位讀取由出現在字元集的其餘部分的第一個字元。
請注意 %[a-z] 和 %[z-a] 解譯為對 **%[abcde...z]**的對等用法。 這是一般的 scanf 函式擴充,但請注意, ANSI 標準不需要它。
讀取未結束的字串
若要儲存字串,而不儲存一結束的 null 字元 (「\ 0 "),請使用這個規格 %nc n 是十進位整數的地方。 在這種情況下, c 型別字元表示引數是指向字元陣列。 下 n 字元輸入資料流讀入指定的位置,因此, null 字元 (「\ 0 ") 未附加。 如果 n 未指定,其預設值為 1。
當 scanf 停止讀取欄位
scanf 函式會掃描每個輸入欄位,由字元的字元。 會因為各種理由,才能達到空白字元可能會停止讀取特定輸入欄位:
指定的寬度結尾。
下一個字元無法轉換成所指定。
下一個字元相衝突時應該符合的控制字串中的字元。
下一個字元不會出現在指定的字元集。
無論原因為何, scanf 函式時,停止讀取輸入欄位時,下一個輸入欄位會考慮開始第一個未讀取的字元。 衝突的字元,,如果有的話,視為未讀取並為下一個輸入欄位的第一個字元或在後續讀取作業的第一個字元的輸入資料流。
請參閱
參考
scanf、_scanf_l、wscanf、_wscanf_l