• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            唐吉訶德

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            這里有些sscanf()的一些使用說(shuō)明,都是從論壇,Blog里整理出來(lái)的。供大家使用。
               通過(guò)學(xué)習(xí)和使用個(gè)人認(rèn)為,在字符串格式不是很復(fù)雜,但是也并不簡(jiǎn)單的時(shí)候用這個(gè)函數(shù)比較合適,這個(gè)尺度就要靠自己把握了,字符串不是很復(fù)雜,但自己寫個(gè)處理的函數(shù)比較麻煩,效率也不高,就用這個(gè)函數(shù),如果字符串很復(fù)雜,那就用正則表達(dá)式吧。
            不多說(shuō)了,看看下面這些介紹和列子吧!
            名稱:sscanf() - 從一個(gè)字符串中讀進(jìn)與指定格式相符的數(shù)據(jù).
            函數(shù)原型:
            Int  sscanf( string str, string fmt, mixed var1, mixed var2 ... );
            int  scanf( const char *format [,argument]... );
            說(shuō)明:
            sscanf與scanf類似,都是用于輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源。
            其中的format可以是一個(gè)或多個(gè) {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號(hào)}
            支持集合操作:
                 %[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)
                 %[aB'] 匹配a、B、'中一員,貪婪性
                 %[^a] 匹配非a的任意字符,貪婪性
            例子:
            1. 常見用法。
                char buf[512] = {0};
                sscanf("123456 ", "%s", buf);
                printf("%s\n", buf);
            結(jié)果為:123456
            2. 取指定長(zhǎng)度的字符串。如在下例中,取最大長(zhǎng)度為4字節(jié)的字符串。
                sscanf("123456 ", "%4s", buf);
                printf("%s\n", buf);
            結(jié)果為:1234
            3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
                sscanf("123456 abcdedf", "%[^ ]", buf);
                printf("%s\n", buf);
            結(jié)果為:123456
             
            4.  取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
                sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
                printf("%s\n", buf);
            結(jié)果為:123456abcdedf
             
            5.  取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
                sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
                printf("%s\n", buf);
            結(jié)果為:123456abcdedf
            6、給定一個(gè)字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,先將 "iios/"過(guò)濾掉,再將非'@'的一串內(nèi)容送到buf中
                sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
                printf("%s\n", buf);
            結(jié)果為:12DDWDFF
             
            7、給定一個(gè)字符串““hello, world”,僅保留world。(注意:“,”之后有一空格)
                sscanf(“hello, world”,  "%*s%s",  buf);  
                printf("%s\n", buf);
            結(jié)果為:world
            %*s表示第一個(gè)匹配到的%s被過(guò)濾掉,即hello被過(guò)濾了
            如果沒(méi)有空格則結(jié)果為NULL。
            8、
             char *s="1try234delete5" 
            則:
            sscanf(s, "1%[^2]234%[^5]", s1, s2);
            scanf的format中出現(xiàn)的非轉(zhuǎn)換字符(%之前或轉(zhuǎn)換字符之后的字符),即此例中的1234用來(lái)跳過(guò)輸入中的相應(yīng)字符;
            ‘[]’的含義與正則表達(dá)式中相同,表示匹配其中出現(xiàn)的字符序列;^表示相反。使用[ ]時(shí)接收輸入的變量必須是有足夠存儲(chǔ)空間的char、signed char、unsigned char數(shù)組。記住[也是轉(zhuǎn)換字符,所以沒(méi)有s了。
            8、分割以某字符標(biāo)記的字符串。
             char test[]="222,333,444,,,555,666";
             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、一個(gè)提取用戶個(gè)人資料中郵件地址的例子
            #include<cstdlib>
            #include<cstdio>
            using namespace std;
            int main()
            {
                char a[20]={0};
                char b[20]={0};
                //假設(shè)email地址信息以';'結(jié)束
                sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a);
                //假設(shè)email地址信息沒(méi)有特定的結(jié)束標(biāo)志
                sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b);
                printf("%s\n",a);
                printf("%s\n",b);
                system("pause");
                return 0;
            }
              關(guān)鍵是"%*[^:]:%[^;]"和"%*[^:]:%s"這兩個(gè)參數(shù)的問(wèn)題
              %*[^:]    表示滿足"[]"里的條件將被過(guò)濾掉,不會(huì)向目標(biāo)參數(shù)中寫入值。這里的意思是在
                        第一個(gè)':'之前的字符會(huì)在寫入時(shí)過(guò)濾掉,'^'是表示否定的意思,整個(gè)參數(shù)翻譯
                        成白話就是:將在遇到第一個(gè)':'之前的(不為':'的)字符全部過(guò)濾掉。
              :         自然就是跳過(guò)':'的意思。
              %[^;]     拷貝字符直到遇到';'。
            一下摘自:http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx
            %[ ] 的用法:%[ ]表示要讀入一個(gè)字符集合, 如果[ 后面第一個(gè)字符是”^”,則表示反意思。
                                 [ ]內(nèi)的字符串可以是1或更多字符組成。空字符集(%[])是違反規(guī)定的,可
                                 導(dǎo)致不可預(yù)知的結(jié)果。%[^]也是違反規(guī)定的。
                     
            %[a-z] 讀取在 a-z 之間的字符串,如果不在此之前則停止,如
                          char s[]="hello, my friend” ;         // 注意: ,逗號(hào)在不 a-z之間
                          sscanf( s, “%[a-z]”, string ) ; // string=hello

            %[^a-z] 讀取不在 a-z 之間的字符串,如果碰到a-z之間的字符則停止,如
                          char s[]="HELLOkitty” ;         // 注意: ,逗號(hào)在不 a-z之間
                          sscanf( s, “%[^a-z]”, string ) ; // string=HELLO

            %*[^=]    前面帶 * 號(hào)表示不保存變量。跳過(guò)符合條件的字符串。
                          char s[]="notepad=1.0.0.1001" ;
                   char szfilename [32] = "" ;
                   int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,因?yàn)闆](méi)保存
             int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
            %40c      讀取40個(gè)字符
                   The run-time
             library does not automatically append a null terminator
             to the string, nor does reading 40 characters
             automatically terminate the scanf() function. Because the
             library uses buffered input, you must press the ENTER key
             to terminate the string scan. If you press the ENTER before
             the scanf() reads 40 characters, it is displayed normally,
             and the library continues to prompt for additional input
             until it reads 40 characters

            %[^=]     讀取字符串直到碰到’=’號(hào),’^’后面可以帶更多字符,如:
                          char s[]="notepad=1.0.0.1001" ;
                   char szfilename [32] = "" ;
                   int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad     
                   如果參數(shù)格式是:%[^=:] ,那么也可以從 notepad:1.0.0.1001讀取notepad
                         
            使用例子:
             char s[]="notepad=1.0.0.1001" ;
             char szname [32] = "" ;
             char szver [32] = “” ;
            sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001
            總結(jié):%[]有很大的功能,但是并不是很常用到,主要因?yàn)椋?/div>
            1、許多系統(tǒng)的 scanf 函數(shù)都有漏洞. (典型的就是 TC 在輸入浮點(diǎn)型時(shí)有時(shí)會(huì)出錯(cuò)).
            2、用法復(fù)雜, 容易出錯(cuò).
            3、編譯器作語(yǔ)法分析時(shí)會(huì)很困難, 從而影響目標(biāo)代碼的質(zhì)量和執(zhí)行效率.
            個(gè)人覺(jué)得第3點(diǎn)最致命,越復(fù)雜的功能往往執(zhí)行效率越低下。而一些簡(jiǎn)單的字符串分析我們可以自已處理。

            以前只是簡(jiǎn)單是使用sscanf,卻沒(méi)發(fā)現(xiàn)其還有如此強(qiáng)大的功能
             char str0[100],str1[100],str2[100],str3[100];

             sscanf("abcde abc 123 aaa","%s %s %s %s",str0,str1,str2,str3);
             結(jié)果:str0="abcde"   str1="abc"  str2 = "123" str3="aaa"

             sscanf("abcde abc 123 aaa","abc%s %s %*d %s",str0,str1,str3);
             結(jié)果:str0="abcde"   str1="abc"  str3="aaa"

             sscanf("abc123 efg456","%4s",str0);
             結(jié)果:str0="abc1"   

             sscanf("abc123 efg456a4","%[a-z 1-5]",str0);
             結(jié)果:str0="abc123 efg45"   

            sscanf("abc123 efg456a4","%[a-z1-5]",str0);
             結(jié)果:str0="abc123" 

             sscanf("ABCTabcZ123 efg456","%[A-P]",str0);
             結(jié)果:str0="ABC"   

             sscanf("abc 12345","%[^ ]",str0);
             結(jié)果:str0="abc"   

             sscanf("abc 12345","%[^4]",str0);
             結(jié)果:str0="abc 123"   

             sscanf("fdaBs 52aB1asdf","%[^4-0]",str0);
             結(jié)果:str0="fdaBs 5"   

             sscanf("abc 12345","%[^ ]%[^3]",str0,str1);
             結(jié)果:str0="abc"    str1="12"

             sscanf("abc301abc2345","%*[^9-0]%s",str0); 
             結(jié)果:str0="301abc2345"   
             sscanf("bca@123efg4@5abc","%*[^@]@%[^@]",str0);
             結(jié)果:str0="123efg4"   

            posted on 2010-04-25 10:47 心羽 閱讀(3758) 評(píng)論(1)  編輯 收藏 引用 所屬分類: VC/MFC

            Feedback

            # re: sscanf()的一些使用說(shuō)明 2014-03-13 17:56 wewea
            謝謝  回復(fù)  更多評(píng)論
              

            久久久久久久99精品免费观看| 精品久久久无码中文字幕天天 | 天天躁日日躁狠狠久久| 伊人久久一区二区三区无码| 青青草原综合久久大伊人| 久久久久亚洲AV无码永不| 久久精品免费网站网| 亚洲综合熟女久久久30p| 2021国产成人精品久久| 精品久久久久成人码免费动漫| 狼狼综合久久久久综合网| 国产精品嫩草影院久久| 亚洲午夜久久久久久久久电影网| 久久不射电影网| 久久中文字幕人妻丝袜| 久久99精品久久久久久噜噜| 一本色道久久88—综合亚洲精品| 91麻精品国产91久久久久 | 99精品国产在热久久| 亚洲国产成人久久一区久久| 久久97精品久久久久久久不卡| 久久无码专区国产精品发布| 国产精品久久久久久久久鸭| 久久精品国产亚洲αv忘忧草 | 久久久99精品成人片中文字幕| 久久精品国产亚洲AV无码麻豆| 热RE99久久精品国产66热| 91久久福利国产成人精品| 亚洲精品乱码久久久久久自慰| 日韩亚洲国产综合久久久| 国产精品久久久99| 久久精品成人免费看| 久久久久久夜精品精品免费啦| 久久久久se色偷偷亚洲精品av| 亚洲国产成人久久一区WWW| 亚洲精品综合久久| 亚洲午夜无码久久久久小说| 一本综合久久国产二区| 亚洲日韩欧美一区久久久久我| 天天影视色香欲综合久久| 人人妻久久人人澡人人爽人人精品|