scanf()函數用法

雖然有人說在大型程序設計中永遠不要使用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 <stdio.h>
bool skip()
{
    scanf("%*[^0-9]");
    return true;
}
int main()
{
    int n;
    while (skip() && scanf("%d", &n)!=EOF)
        printf("%d/n", n);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章