scanf 特殊用法
來源:互聯網
上載者:User
文法:
#include <stdio.h>
int scanf( const char *format, ... );
類似函數有
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);//指定輸入資料流
int sscanf(const char *str, const char *format, ...);//指定緩衝區
scanf()函數根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它參數. 它和printf()有點類似. format(格式)字串由控制字元,空白字元和非空白字元組成. 控制字元以一個%符號開始,如下:
控制字元 說明
%c 一個單一的字元
%d 一個十進位整數
%i 一個整數
%e, %f, %g 一個浮點數
%o 一個八位元
%s 一個字串
%x 一個十六進位數
%p 一個指標
%n 一個等於讀取字元數量的整數
%u 一個不帶正負號的整數
%[] 一個字元集
%% 一個精度符號
1.scanf()讀取匹配format(格式)字串的輸入. 當讀取到一個控制字元, 它把值放置到下一個變數. 空白(tabs, 空格等等)會跳過. 非空白字元和輸入匹配, 然後丟棄. 如果是一個在%符號和控制符間的數量, 那麼只有指定數量的字元轉換到變數中. 如果scanf()遇到一個字元集(用%[]控制字元表示), 那麼在括弧中的任一字元都會讀取到變數中. scanf()的傳回值是成功賦值的變數數量, 發生錯誤時返回EOF.
2.scanf()函數的一般格式為:scanf("格式字串",輸入項首地址表)
3.scanf的格式控制的一般形式為:%[*][寬度][F|N][h|l]類型字元
[]中的控制字元為可選項
4."*"表示該輸入項讀入後不賦予任何變數,即跳過該輸入值。
5."寬度"表示輸入讀入字元的長度,對於整型表示截取相應寬度的數字賦給後面列表中的相應變數;對於字元型表示讀入相應長度的字元後把第一個字元賦給相應的變數,其餘的自動捨棄。例如scanf("-=",&a, &b);如果輸入為12345則將12賦給a,將45賦給b;scanf(",<",&a, &b);如果輸入為12345則將'1'賦給a,將'3'賦給b .
"%s" 整個輸入作為一個串,並設定末尾的'\0'
"%ns",n為整數,讀入的串最長不超過n,然後在末尾補'\0'
%nf 讀入的浮點數最多有n位整數,位元多於n,會截斷。
"%n[a-z]" 讀入最多n個字元,如果遇到非a-z的字元,停止
"%[^=]" 讀入任意多的字元,直到遇到"="停止
"%n[^=]" 讀入"="號前的至多n 個字元
6.F 、N、h、l分別表示遠指標、近指標、短整和長整型。
7.對於輸入字串還有一些比較有用的控制。
例如經常需要讀入一行字串,而這串字 符裡面可能有空格、定位字元等空白字元,如果直接用%s是不可以的,於是有些人就想到用gets(),當然這也是一種選擇,但是懂C的人基本上都知道 gets()是一個很危險的函數,而且很難控制,特別是與scanf()交替使用時前者的劣勢更是一覽無餘,所以gets()一般是不推薦用的,其實用% [^\n]就可以很好的解決這個問題了,^表示"非",即讀入其後面的字元就結束讀入。這樣想讀入一行字串直接用scanf("%[^ \n]%*c",str);就可以了,
%*c的作用是讀入\n,否則後面讀入的將一直是\n。
所有對%s起作用的控制都可以用%[],比如%[0-9]表示唯讀入'0'到'9'之間的字元,%[a-zA-Z]表示唯讀入字母,
'-'是範圍串連符,當然也可以直接列出你需要讀入的字元。
如果你只需要讀"abc"裡面的字元就可以用%[abc] (或者%[cab]、%[acb]、%[a-c]、%[c-a].....),
如果想讀入某個範圍之外的字串就在前面加一個'^',如:%[^a-z]就表示讀入小寫字母之外的字元。
例如從鍵盤輸入的"1235ab86"中讀取1235、86給n,有如下方法:
#include <stdio.h>
bool skip(){
scanf("%*[^0-9]");
return true;
}
void main()
{
int n;
while(skip() && scanf("%d", &n)!=EOF)
printf("%d\n", n);
}
輸出為:1235
86