scanf中一種很少見但很有用的轉換字符:[...]和[ ^...]。
#include<stdio.h>
int main()
{
char strings[100];
scanf("%[1234567890]",strings);
printf("%s",strings);
return 0;
}
運行,輸入:1234werew后,結果是:1234。
通過運行可以發現它的作用是:如果輸入的字符屬于方括號內字符串中某個字符,那么就提取該字符;如果一經發現不屬于就結束提取。該方法會自動加上一個字符串結束符到已經提取的字符后面。
scanf("%[^1234567890]",strings); 它的作用是:如果一經發現輸入的字符屬于方括號內字符串中某個字符,那么就結束提取;如果不屬于就提取該字符。該方法會自動加上一個字符串結束符到已經提取的字符后面。
注意:方括號兩邊不能空格,如:scanf("%[ 1234567890 ]",strings); scanf("%[ ^1234567890 ]",strings); 不讓空格也會算在里面的。
用這種方法還可以解決scanf的輸入中不能有空格的問題。只要用
scanf("%[^\n]",strings); 就可以了。很神奇吧。
ANSI C 標準向 scanf() 增加了一種新特性,稱為掃描集(scanset)。 掃描集定義一個字符集合,可由 scanf() 讀入其中允許的字符并賦給對應字符數組。 掃描集合由一對方括號中的一串字符定義,左方括號前必須綴以百分號。 例如,以下的掃描集使 scanf() 讀入字符 A、B 和 C:
%[ABC]
使用掃描集時,scanf() 連續吃進集合中的字符并放入對應的字符數組,直到發現不在集合中的字符為止(即掃描集僅讀匹配的字符)。返回時,數組中放置以 null 結尾、由讀入字符組成的字符串。
用字符 ^ 可以說明補集。把 ^ 字符放為掃描集的第一字符時,構成其它字符組成的命令的補集合,指示 scanf() 只接受未說明的其它字符。
對于許多實現來說,用連字符可以說明一個范圍。 例如,以下掃描集使 scanf() 接受字母 A 到 Z:
%[A-Z]
重要的是要注意掃描集是區分大小寫的。因此,希望掃描大、小寫字符時,應該分別說明大、小寫字母。
搜集一些特殊用法:
%[ ] 的用法:%[ ]表示要讀入一個字符集合, 如果[ 后面第一個字符是”^”,則表示反意思。
[ ]內的字符串可以是1或更多字符組成。空字符集(%[])是違反規定的,可
導致不可預知的結果。%[^]也是違反規定的。
%[a-z] 讀取在 a-z 之間的字符串,如果不在此之前則停止,如
char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間
sscanf( s, “%[a-z]”, string ) ; // string=hello
%[^a-z] 讀取不在 a-z 之間的字符串,如果碰到a-z之間的字符則停止,如
char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面帶 * 號表示不保存變量。跳過符合條件的字符串。
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%*[^=]", szfilename ) ;
// szfilename=NULL,因為沒保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ;
// szfilename=1.0.0.1001
%40c 讀取40個字符
%[^=] 讀取字符串直到碰到’=’號,’^’后面可以帶更多字符,如:
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%[^=]", szfilename ) ;
// szfilename=notepad
如果參數格式是:%[^=:] ,那么也可以從 notepad:1.0.0.1001讀取notepad