sscanf()詳解
透過學習和使用個人認為,在字串格式不是很複雜,但是也並不簡單的時候用這個函式比較合適,這個尺度就要靠自己把握了,字串不是很複雜,但自己寫個處理的函式比較麻煩,效率也不高,就用這個函式,如果字串很複雜,那就用正規表示式吧。
不多說了,看看下面這些介紹和列子吧!
函式原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源。
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | 't' | 'n' | 非%符號}
%[a-z] 表示匹配a到z中任意字元,貪婪性(儘可能多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任意字元,貪婪性
1. 常見用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%sn", buf);
結果為:123456
sscanf("123456 ", "%4s", buf);
printf("%sn", buf);
結果為:1234
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%sn", buf);
結果為:123456
4. 取僅包含指定字符集的字串。如在下例中,取僅包含1到9和小寫字母的字串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%sn", buf);
結果為:123456abcdedf
5. 取到指定字符集為止的字串。如在下例中,取遇到大寫字母為止的字串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%sn", buf);
結果為:123456abcdedf
sscanf("", "%*[^/]/%[^@]", buf);
printf("%sn", buf);
結果為:12DDWDFF
7、給定一個字串““hello, world”,僅保留world。(注意:“,”之後有一空格)
printf("%sn", buf);
結果為:world
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果為NULL。
8、
char *s="1try234delete5"
則:
sscanf(s, "1%[^2]234%[^5]", s1, s2);
scanf的format中出現的非轉換字元(%之前或轉換字元之後的字元),即此例中的1234用來跳過輸入中的相應字元;
‘[]’的含義與正規表示式中相同,表示匹配其中出現的字元序列;^表示相反。使用[ ]時接收輸入的變數必須是有足夠儲存空間的char、signed char、unsigned char陣列。記住[也是轉換字元,所以沒有s了。
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4];
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7);
printf("sssa1=%s",s1);
printf("sssa2=%s",s2);
printf("sssa3=%s",s3);
printf("sssa4=%s",s4);
printf("sssa5=%s",s5);
printf("sssa6=%s",s6);
printf("sssa7=%s",s7);
9、一個提取使用者個人資料中郵件地址的例子
#include
#include
using namespace std;
int main()
{
char a[20]={0};
char b[20]={0};
//假設email地址資訊以';'結束
sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a);
//假設email地址資訊沒有特定的結束標誌
sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b);
printf("%sn",a);
printf("%sn",b);
system("pause");
return 0;
}
關鍵是"%*[^:]:%[^;]"和"%*[^:]:%s"這兩個引數的問題
%*[^:] 表示滿足"[]"裡的條件將被過濾掉,不會向目標引數中寫入值。這裡的意思是在
第一個':'之前的字元會在寫入時過濾掉,'^'是表示否定的意思,整個引數翻譯
成白話就是:將在遇到第一個':'之前的(不為':'的)字元全部過濾掉。
: 自然就是跳過':'的意思。
%[^;] 複製字元直到遇到';'。
%[ ] 的用法:%[ ]表示要讀入一個字符集合, 如果[ 後面第一個字元是”^”,則表示反意思。
%[^a-z] 讀取不在 a-z 之間的字串,如果碰到a-z之間的字元則停止,如
%*[^=] 前面帶 * 號表示不儲存變數。跳過符合條件的字串。
%[^=] 讀取字串直到碰到’=’號,’^’後面可以帶更多字元,如:
以前只是簡單是使用sscanf,卻沒發現其還有如此強大的功能
char str0[100],str1[100],str2[100],str3[100];
sscanf("abcde abc 123 aaa","%s %s %s %s",str0,str1,str2,str3);
結果:str0="abcde" str1="abc" str2 = "123" str3="aaa"
sscanf("abcde abc 123 aaa","abc%s %s %*d %s",str0,str1,str3);
結果:str0="abcde" str1="abc" str3="aaa"
sscanf("abc123 efg456","%4s",str0);
結果:str0="abc1"
sscanf("abc123 efg456a4","%[a-z 1-5]",str0);
結果:str0="abc123 efg45"
sscanf("abc123 efg456a4","%[a-z1-5]",str0);
結果:str0="abc123"
sscanf("ABCTabcZ123 efg456","%[A-P]",str0);
結果:str0="ABC"
sscanf("abc 12345","%[^ ]",str0);
結果:str0="abc"
sscanf("abc 12345","%[^4]",str0);
結果:str0="abc 123"
sscanf("fdaBs 52aB1asdf","%[^4-0]",str0);
結果:str0="fdaBs 5"
sscanf("abc 12345","%[^ ]%[^3]",str0,str1);
結果:str0="abc" str1="12"
sscanf("abc301abc2345","%*[^9-0]%s",str0);
結果:str0="301abc2345"
sscanf(");
結果:str0="123efg4"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1042505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C 語言中的 sscanf 詳解
- Analyzing Strings with sscanf
- C語言函式sscanf()的用法C語言函式
- 藍橋杯-航班時間(簡單寫法+sscanf的應用)
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- Lombok 註解詳解Lombok
- Java註解詳解Java
- Java 註解詳解Java
- Java註解最全詳解(超級詳細)Java
- HiveQL詳解Hive
- 詳解Inode
- Vuex詳解Vue
- PWA詳解
- 詳解CountDownLatchCountDownLatch
- DiffUtil詳解
- iptables詳解
- TCP詳解TCP
- CDN詳解
- Typescript詳解TypeScript
- Mybatis詳解MyBatis
- Synchronized詳解synchronized
- TLS 詳解TLS
- 詳解bind
- 詳解GOPATHGo
- HTTP 詳解HTTP
- JavaScript this詳解JavaScript
- BT詳解
- nginx 詳解Nginx
- @autowired詳解
- ECharts 詳解Echarts
- DiskBasedCache詳解
- JavaWeb詳解JavaWeb
- IndexedDB詳解Index
- BART詳解
- JDBC詳解JDBC
- Pod詳解
- HugePages詳解
- Service詳解