scanf 寬度規格

此資訊適用於格式字串中的轉譯工作scanf系列的函式,包括安全版本,例如scanf_s。這些函式通常會假設輸入資料流分成一連串的語彙基元。泛空白字元 (空格、 tab 或換行) 或數字的型別,由第一個字元不能被轉換成數值的文字的數字資料型別的自然結束的情況下,會分隔語彙基元。不過,寬度規格可能使用會造成剖析的語彙基元自然結束之前停止輸入。

寬度之間的字元組成,規格%和型別欄位規範,其中可能包括正整數呼叫寬度欄位和表示欄位中,可能也被視為欄位類型修飾詞,大小的一或多個字元可用來指示是否為整數型別是。這類字元被指大小 」 前置詞。

[寬度] 欄位

寬度欄位是十進位正整數控制字元的最大數目為該欄位。不能超過寬度字元會轉換並儲存在對應的argument。您最多能寬度 字元可能會讀取是否空白字元 (空格、 tab 或換行) 或無法依據指定的格式來轉換一個字元之前發生 寬度為止。

寬度規格是分開且不同於這些函式的安全版本所需的緩衝區大小引數 (亦即, scanf_swscanf_s等。)。在下列範例中,寬度規格為 20,最多可指出會從輸入資料流讀取的 20 個字元。緩衝區的長度為 21,其中包括可能的 20 個字元加上 null 結束字元的空間:

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

如果寬度欄位不在使用中, scanf_s將嘗試讀取至字串的整個語彙基元。如果指定的大小不是足以容納整個的語彙基元,執行任何動作將寫入目的字串。如果寬度 指定欄位,然後第一個 寬度在權杖中的字元會寫入目的地字串以及包含 null 結束字元。

大小 」 前置詞

選擇性的前置詞 hlllI64,以及 l 表示的容量argument (長或短,單一位元組字元或萬用字元,他們修改型別字元而定)。這些格式規格字元用型別中有字元scanfwscanf函式,以指定的引數的解譯方式,如下表所示。型別前置字元 I64 是 Microsoft 擴充功能而非 ANSI 相容。"鍵入字元 scanf 函式 」 表格中描述的型別字元和及其意義scanf 型別功能變數字元

注意事項注意事項

hl,以及 l 前置字元會與資料型別搭配使用時,Microsoft 副檔名char。

大小為 scanf 和 wscanf 格式型別規範中的前置詞

若要指定

使用前置詞

以型別規範

double

l

e, E, f, g, or G

長雙精度 (和雙精度浮點相同)

L

e, E, f, g, or G

長 int

l

d, i, o, x, or X

長時間不帶正負號的 int

l

u

長長的時間

ll

d, i, o, x, or X

short int

h

d, i, o, x, or X

簡短不帶正負號的 int

h

u

__int64

I64

d, i, o, u, x, or X

半形字元scanf

h

c or C

半形字元wscanf

h

c or C

使用萬用字元scanf

l

c or C

使用萬用字元wscanf

l

c, or C

半形 – 與字元字串scanf

h

s or S

半形 – 與字元字串wscanf

h

s or S

寬字元字串scanf

l

s or S

寬字元字串wscanf

l

s or S

下面範例使用 hlscanf_s函式和wscanf_s函式:

scanf_s( "%ls", &x, 2 );     // Read a wide-character string
wscanf_s( "%hC",&x, 2 );    // Read a single-byte character

如果使用不安全的函式在scanf家族,省略大小參數,表示前一個引數的緩衝區長度。

閱讀 Undelimited 的字串

若要讀取字串沒有以泛空白字元分隔字元,一組以方括弧括住的字元 ([]) 可以取代 s (字串) 型別字元。以方括弧括住的字元組被指控制項的字串。在相對應的輸入的欄位研讀不會出現在控制項的字串中的第一個字元。如果集合中的第一個字元就插入號 (^),則相反: 輸入的欄位不會顯示在其他的字集的第一個字元開始,向上讀取。

請注意, %[a-z[z-a] % 會被解譯為相當於 %[abcde...z。這是一般scanf函式的擴充,但請注意 ANSI 標準不需要它。

讀取未結束的字串

若要儲存為字串,而不會儲存結束的 null 字元 ('\ 0'),請使用此規格%ncn 是十進位整數。如此一來, 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 型別功能變數字元