1 #if 0
2 1,sscanf():從一個字符串中讀進與指定格式相符的數據. 3 2,sscanf與scanf類似,都是用於輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源。 4 3,關於正則表達式: 5 (1)%[..],當字符屬於方括號里表達式表示的字符集時繼續讀取,否則停止.方括號里的和正則表達式差不多,^是"排除..."的意思 6 (2)%*[..],直接跳過方括號里的字符集並繼續讀取 7 #endif
8
9 #include <iostream>
10 using namespace std; 11
12 int main() 13 { 14 char str[10]; 15 for (int i = 0; i < 10; i++) str[i] = '!'; 16 cout<<str<<endl; 17 sscanf("123456","%s",str);//---------str的值為 "123456\0!!!" 18 //這個實驗很簡單,把源字符串"123456"拷貝到str的前6個字符,並且把str的第7個字符設為null字符,也就是\0
19 cout<<str<<endl; 20
21 for (int i = 0; i < 10; i++) str[i] = '!'; 22 sscanf("123456","%3s",str); //---------str的值為 "123\0!!!!!!" 23 //看到沒有,正則表達式的百分號后面多了一個3,這告訴sscanf只拷貝3個字符給str,然后把第4個字符設為null字符。
24 cout<<str<<endl; 25
26 for (int i = 0; i < 10; i++) str[i] = '!'; 27 sscanf("aaaAAA","%[a-z]",str);// ---------str的值為 "aaa\0!!!!!!" 28 //從這個實驗開始我們會使用正則表達式,括號里面的a-z就是一個正則表達式,它可以表示從a到z的任意字符, 29 //在繼續討論之前,我們先來看看百分號表示什么意思,%表示選擇,%后面的是條件,比如實驗1的"%s",s是一個條件,表示任意字符,"%s"的意思是:只要輸入的東西是一個字符,就把它拷貝給str。實驗2的"%3s"又多了一個條件:只拷貝3個字符。實驗3的“%[a-z]”的條件稍微嚴格一些,輸入的東西不但是字符,還得是一個小寫字母的字符,所以實驗3只拷貝了小寫字母"aaa"給str,別忘了加上null字符。
30 cout<<str<<endl; 31
32 for (int i = 0; i < 10; i++) str[i] = '!'; 33 sscanf("AAAaaaBBB","%[^a-z]",str);// ---------str的值為 "AAA\0!!!!!!" 34 //對於所有字符,只要不是小寫字母,都滿足"^a-z"正則表達式,符號^表示邏輯非。前3個字符都不是小寫字符,所以將其拷貝給str,但最后3個字符也不是小寫字母,為什么不拷貝給str呢?這是因為當碰到不滿足條件的字符后,sscanf就會停止執行,不再掃描之后的字符。
35 cout<<str<<endl; 36
37 /*
38 for (int i = 0; i < 10; i++) str[i] = '!'; 39 sscanf("AAAaaaBBB","%[A-Z]%[a-z]",str);// ---------段錯誤 40 //這個實驗的本意是:先把大寫字母拷貝給str,然后把小寫字母拷貝給str,但很不幸,程序運行的時候會發生段錯誤,因為當sscanf掃描到字符a時,違反了條件"%[A-Z]",sscanf就停止執行,不再掃描之后的字符,所以第二個條件也就沒有任何意義,這個實驗說明:不能使用%號兩次或兩次以上 41 cout<<str<<endl; 42 */
43
44 for (int i = 0; i < 10; i++) str[i] = '!'; 45 sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str); //---------str的值為 "aaa\0!!!!!!" 46 //這個實驗出現了一個新的符號:%*,與%相反,%*表示過濾滿足條件的字符,在這個實驗中,%*[A-Z]過濾了所有大寫字母,然后再使用%[a-z]把之后的小寫字母拷貝給str。如果只有%*,沒有%的話,sscanf不會拷貝任何字符到str,這時sscanf的作用僅僅是過濾字符串。
47 cout<<str<<endl; 48
49 for (int i = 0; i < 10; i++) str[i] = '!'; 50 sscanf("AAAaaaBBB","%[a-z]",str);// ---------str的值為 "!!!!!!!!!!" 51 //做完前面幾個實驗后,我們都知道sscanf拷貝完成后,還會在str的后面加上一個null字符,但如果沒有一個字符滿足條件,sscanf不會在str 的后面加null字符,str的值依然是10個驚嘆號。這個實驗也說明了,如果不使用%*過濾掉前面不需要的字符,你永遠別想取得中間的字符。
52 cout<<str<<endl; 53
54 for (int i = 0; i < 10; i++) str[i] = '!'; 55 sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str); //---------str的值為 "BC\0!!!!!!!" 56 //這是一個綜合實驗,但這個實驗的目的不是幫我們復習前面所學的知識,而是展示兩個值得注意的地方: 57 //注意1:%只能使用一次,但%*可以使用多次,比如在這個實驗里面,先用%*[A-Z]過濾大寫字母,然后用%*[a-z]過濾小寫字母。 58 // 注意2:^后面可以帶多個條件,且這些條件都受^的作用,比如^a-z=表示^a-z且^=(既不是小寫字母,也不是等於號)。
59 cout<<str<<endl; 60
61 for (int i = 0; i < 10; i++) str[i] = '!'; 62 int k; 63 sscanf("AAA123BBB456", "%*[A-Z]%i", &k); //---------k的值為123 64 //首先,%*[^0-9]過濾前面非數字的字符,然后用%i把數字字符轉換成int型的整數,拷貝到變量k,注意參數必須使用k的地址。 cout<<str<<endl;
65 cout<<k<<endl; 66 return 0; 67 }