scanf中的%[^\n]%*c格式
(2011-02-19 16:12:38)
scanf
語法:
#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