• <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>

            極品垃圾

            初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。

            公告

            初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            • 隨筆 - 0
            • 文章 - 61
            • 評論 - 1
            • 引用 - 0

            常用鏈接

            留言簿(2)

            隨筆分類

            文章分類(55)

            文章檔案(61)

            搜索

            •  

            最新評論

            sscanf()的一些使用說明
            這里有些sscanf()的一些使用說明,都是從論壇,Blog里整理出來的。供大家使用。
               通過學習和使用個人認為,在字符串格式不是很復雜,但是也并不簡單的時候用這個函數比較合適,這個尺度就要靠自己把握了,字符串不是很復雜,但自己寫個處理的函數比較麻煩,效率也不高,就用這個函數,如果字符串很復雜,那就用正則表達式吧。
            不多說了,看看下面這些介紹和列子吧!
            名稱: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("%s\n", buf);
            結果為:123456
            2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
                sscanf("123456 ", "%4s", buf);
                printf("%s\n", buf);
            結果為:1234
            3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
                sscanf("123456 abcdedf", "%[^ ]", buf);
                printf("%s\n", buf);
            結果為:123456
             
            4.  取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
                sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
                printf("%s\n", buf);
            結果為:123456abcdedf
             
            5.  取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
                sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
                printf("%s\n", buf);
            結果為:123456abcdedf
            6、給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
                sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
                printf("%s\n", buf);
            結果為:12DDWDFF
             
            7、給定一個字符串““hello, world”,僅保留world。(注意:“,”之后有一空格)
                sscanf(“hello, world”,  "%*s%s",  buf);  
                printf("%s\n", 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了。
            8、分割以某字符標記的字符串。
             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、一個提取用戶個人資料中郵件地址的例子
            #include<cstdlib>
            #include<cstdio>
            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("%s\n",a);
                printf("%s\n",b);
                system("pause");
                return 0;
            }
              關鍵是"%*[^:]:%[^;]"和"%*[^:]:%s"這兩個參數的問題
              %*[^:]    表示滿足"[]"里的條件將被過濾掉,不會向目標參數中寫入值。這里的意思是在
                        第一個':'之前的字符會在寫入時過濾掉,'^'是表示否定的意思,整個參數翻譯
                        成白話就是:將在遇到第一個':'之前的(不為':'的)字符全部過濾掉。
              :         自然就是跳過':'的意思。
              %[^;]     拷貝字符直到遇到';'。
            一下摘自:http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx
            %[ ] 的用法:%[ ]表示要讀入一個字符集合, 如果[ 后面第一個字符是”^”,則表示反意思。
                                 [ ]內的字符串可以是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個字符
                   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

            %[^=]     讀取字符串直到碰到’=’號,’^’后面可以帶更多字符,如:
                          char s[]="notepad=1.0.0.1001" ;
                   char szfilename [32] = "" ;
                   int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad     
                   如果參數格式是:%[^=:] ,那么也可以從 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
            總結:%[]有很大的功能,但是并不是很常用到,主要因為:
            1、許多系統的 scanf 函數都有漏洞. (典型的就是 TC 在輸入浮點型時有時會出錯).
            2、用法復雜, 容易出錯.
            3、編譯器作語法分析時會很困難, 從而影響目標代碼的質量和執行效率.
            個人覺得第3點最致命,越復雜的功能往往執行效率越低下。而一些簡單的字符串分析我們可以自已處理。

            posted on 2008-11-10 10:52 極品垃圾 閱讀(473) 評論(0)  編輯 收藏 引用 所屬分類: 每天的學習所得

            女同久久| 大蕉久久伊人中文字幕| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 精品久久久无码人妻中文字幕 | 亚洲午夜久久久| 久久久久久久女国产乱让韩| 国产精品免费福利久久| 精品久久人妻av中文字幕| 国产精品成人精品久久久| 大香伊人久久精品一区二区 | 久久久亚洲欧洲日产国码二区| 久久九九精品99国产精品| 国产69精品久久久久9999| 久久夜色精品国产亚洲| 91久久国产视频| 伊人久久久AV老熟妇色| 久久91这里精品国产2020| 精品国产乱码久久久久久郑州公司| 久久精品国产清自在天天线| 国产精品久久自在自线观看| 亚洲午夜无码AV毛片久久| 国产成人久久精品二区三区| 亚洲精品乱码久久久久久久久久久久 | 久久亚洲精品成人无码网站| 高清免费久久午夜精品| 国内精品九九久久精品| 久久丝袜精品中文字幕| 久久免费精品视频| 成人久久精品一区二区三区| 精品综合久久久久久888蜜芽| 一本色综合网久久| 波多野结衣AV无码久久一区| 日产久久强奸免费的看| 久久99精品国产99久久6| 老司机国内精品久久久久| 久久99精品久久久久久| 久久婷婷成人综合色综合| 日本强好片久久久久久AAA| 性欧美丰满熟妇XXXX性久久久| 中文字幕热久久久久久久| 伊人久久精品无码二区麻豆|