標準輸入輸出函式 和 n說明符的使用方法

2021-05-07 13:21:00 字數 1482 閱讀 2160

標準輸入輸出函式scanf具有相對較多的轉換說明符,它常常作為入門級函式出現在各種教材中。但奇怪的是,和n這兩種都為c89/c99所規定的標準說明符卻鮮少在大多數教材中出現。雖然和n說明符的使用頻率不及其它說明符,但兩者在程式設計中的作用仍然不可小視,尤其是說明符。

眾所周之,scanf以空白字元為定界符,但如果輸入的字串是以其它字元為定界符的,那怎麼辦?就是專門處理這個問題的轉換說明符。轉換說明符可以通過兩種方式產生結果字符集,如果第乙個[字元右邊沒有抑揚符(^),那麼處於之間的字元就是結果字符集,不在其中的可輸入字元都作為定界符;如果左邊[符號緊靠乙個抑揚符(^),那麼意義相反,^和]之間的字元是定界符,其餘可輸入字元是結果字符集。

在使用說明符之前,得先明白兩個概念:一是掃瞄列表。掃瞄列表(scanlist)指的是包含在[和]兩個字元之間除緊靠左邊[字元的抑揚符之外的字元,例如:

scanf("%[abcd]", ptr);

abcd組成掃瞄列表。二是掃瞄字符集(scanset)。掃瞄字符集指的是結果字符集,例如上面的例子,結果字符集就是abcd。如果輸入乙個字串「cbadkjf」,那麼ptr得到的字串是cbad,kjf三個字元都屬於定界符,輸入到k字元時輸入字串被截斷,kjf三個字元被留在stdin裡面。如果帶有抑揚符,例如:

scanf("%[^abcd]", ptr);

掃瞄列表仍然是abcd,但掃瞄字符集是除abcd外的可輸入字元。如果輸入字串「jksferakjjdf」,ptr得到的字串是「jksfer」。如果想限制輸入字串的字元數量,可以象s說明符那樣,在前面使用位域,例如:

scanf("%10[^abcd]", ptr);

這樣結果字串最多只能包含10個字元(除'/0'字元外)。

[符號可以作為掃瞄列表中的乙個成員,但]字元除緊貼最左邊的[字元或抑揚符兩種情況外,其餘情況下都不會被看作掃瞄列表的成員。例如「%abcd]」或者「%[^]abcd]」,上述兩種情況下]字元屬於掃瞄列表的成員,但如果是「%[ab]cd]」,中間的]字元不會被看作掃瞄列表的成員,而且輸入輸出的結果會是亂七八糟的。

scanf("%[a-za-z]", ptr);

那麼掃瞄列表由大小寫各26個字母組成。少數編譯器仍舊把這種情況下的減號視為掃瞄列表成員。

%n說明符輸出有效字元數量,%n在scanf和printf中都可使用。與%n相對應的形參是乙個int型別的指標,%n不影響scanf和printf的返回值。例如:

scanf("%d %d%n", &i, &j, &k);

如果輸入434 6434,則k等於8,而scanf的返回值仍然為2。又如:

scanf("%c%n", &ch, &k);

輸入「sbcdefdg」後,k等於1,而不是8,因為%c只取乙個字元,%n輸出的是有效字元數量。

%n用在printf函式裡,表示輸出的字元數量,例如:

printf("i=%d, j=%d/n%n", i, j, &k);

在i=343、j=123的情況下,k=12,同時%n不影響printf的返回值,其返回值仍然為12,而不是14。

標準輸入輸出函式 和 n說明符的使用方法

標準輸入輸出函式scanf具有相對較多的轉換說明符,它常常作為入門級函式出現在各種教材中。但奇怪的是,和n這兩種都為c89 c99所規定的標準說明符卻鮮少在大多數教材中出現。雖然和n說明符的使用頻率不及其它說明符,但兩者在程式設計中的作用仍然不可小視,尤其是說明符。眾所周之,scanf以空白字元為定...

程式競賽輸入輸出部分(標準的輸入和輸出)

freopen c out.txt r stdin 輸入freopen out.txt w stdout 輸出 也可以在程式執行時臨時修改 abc.exe.txt abc.exe out.txt 程式競賽題目的特點 只做三件事 1 讀入資料。2 計算結果。3 列印輸出。提示 競賽中,輸入輸出不要列印...

Linux shell的標準輸入 輸出和錯誤

原文 1.檔案描述符 在linux shell執行命令時,每個程序都和三個開啟的檔案相聯絡,並使用檔案描述符來引用這些檔案。由於檔案描述符不容易記憶,shell同時也給出了相應的檔名 檔案檔案描述符 輸入檔案 標準輸入 0 預設是鍵盤,為0時是檔案或者其他命令的輸出 輸出檔案 標準輸出 1 預設是螢...