雖然有人說在大型程式設計中永遠不要使用scanf(),但是對於習慣用c的人和參加
acm/icpc的人,
scanf()還是用的比較多的,而且用好了用起來也很方便。
下面整理一點兒平時常需要用到而可能有些人一直理不清的一些知識
一般常識:
scanf()函式的一般格式為:scanf("格式字串",輸入項首位址表)
scanf的格式控制的一般形式為:%[*][寬度][f|n][h|l]型別字元
中的控制字元為可選項
"*"表示該輸入項讀入後不賦予任何變數,即跳過該輸入值。這在減小記憶體開支上面還是有一點用處的,不需要的字元直接跳過,免得申請沒用的變數空間
"寬度"表示輸入讀入字元的長度,對於整型表示擷取相應寬度的數字賦給後面列表中的相應變數;對於字元型表示讀入相應長度的字元後把第乙個字元賦給相應的變數,其餘的自動捨棄。例如scanf("%2d%3d",&a, &b);如果輸入為12345則將12賦給a,將45賦給b;scanf("%2c%3c",&a, &b);如果輸入
為12345則將'1'賦給a,將'3'賦給b
f 、n、h、l分別表示遠指標、近指標、短整和長整型,對於_int64相應的控制字元為ll或i64
"型別字元"為 d -- 輸入十進位制整數 、o -- 輸入八進位制整數 、x -- 輸入十六進製制整數 、u -- 輸入無符號十進位制整數 f或e -- 輸入實型數(用小數形式或指數形式) 、c -- 輸入單個字元 、s -- 輸入字串
字串讀入的一些技巧
對於輸入字串還有一些比較有用的控制,
例如經常需要讀入一行字串,而這串字元裡面可能有空格、製表符等空白字元,
如果直接用%s是不可以的,於是有些人就想到用gets(),當然這也是一種選擇,
但是懂c的人基本上都知道gets()是乙個很危險的函式,而且很難控制,
特別是與scanf()交替使用時前者的劣勢更是一覽無餘,所以gets()一般是不推薦用的。
其實用%[^/n]就可以很好的解決這個問題了,
^表示"非",即讀入其後面的字元就結束讀入。
這樣想讀入一行字串直接用
scanf("%[^/n]%*c",str);
就可以了,
%*c的作用是讀入/n,否則後面讀入的將一直是/n。
所有對%s起作用的控制都可以用%,
比如%[0-9]表示唯讀
入'0'到'9'之間的字元,%[a-za-z]表示唯讀入字母,
'-'是範圍連線符。
當然也可以直接列出你需要讀入的字元,上面讀字母之所以用範圍連線符是因為
要輸入52個字元太麻煩了,
如果你只需要讀"abc"裡面的字元就可以用%[abc] (或者%[cab]、%[acb]、%[a-c]、%[c-a].....),
如果想讀入某個範圍之外的字串就在前面加乙個'^',如:%[^a-z]就表示讀入小寫字母之外的字元
上面這些用法其實可以有很多推廣用法的,比如說你要處理下面的字串
23 44r f30
88888,3245;34:123.
讓你輸出裡面所有的數字,就可以用下面的**:
#include bool skip()
int main()
scanf函式的用法
scanf 通過鍵盤將資料輸入到變數中 兩種用法 用法一 scanf 輸入控制符 輸入引數 功能 將鍵盤輸入的字元轉化為輸入控制符所規定格式的資料,然後存入以輸入引數的值為地質的變數 用法二 scanf 非法輸入控制符 輸入控制符 輸入引數 功能 將從鍵盤輸入的字元轉化為輸入控制符所規定格式的資料,...
c中scanf函式用法
初看scanf時,覺得還是蠻簡單的,但當深入學習後,才發現裡面有很多小細節值得我們去注意。首先,看看scanf的基本格式 scanf 格式化字串 位址表 scanf 函式返回成功賦值的資料項數,出錯時則返回eof。我們輸入的資料大體上可以分為幾個型別 格式化說明符 空白符 空白符包括 空格,製表符,...
Scanf系列函式的高階用法
scanf系列函式的高階用法 scanf 從乙個字串中讀進指定格式相符的資料,主要是用於從給定緩衝區內容輸入到變數,達到給變數賦值的目的。就是所謂的格式化輸入。在一般情況下,我們在使用scanf時都只使用了其簡單的用法。比如 int a 0 int b 0 scanf d d a,b 若這段 在控制...