正則表達式 - C語言

http://blog.csdn.net/pipisorry/article/details/37073843
安全

sscanf/scanf正則使用方法app

%[ ] 的使用方法:%[ ]表示要讀入一個字符集合, 假設[ 後面第一個字符是」^」,則表示反意思。函數

                     [ ]內的字符串可以是1或不少其它字符組成。post

空字符集(%[])是違反規則的。可spa

                     致使不可預知的結果。%[^]也是違反規則的。
          .net

%[a-z] 讀取在 a-z 之間的字符串,假設不在此以前則中止。如orm

              char s[]="hello, my friend」 ;         // 注意: ,逗號在不 a-z之間blog

              sscanf( s, 「%[a-z]」, string ) ; // string=hello
ip

%[^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

總結:%[]有很是大的功能,但是並不是非常常常使用到,主要因爲:

一、不少系統的 scanf 函數都有漏洞. (典型的就是 TC 在輸入浮點型時有時會出錯).

二、使用方法複雜, easy出錯.

三、編譯器做語法分析時會很是困難, 從而影響目標代碼的質量和運行效率.

我的認爲第3點最致命,越複雜的功能每每運行效率越低下。而一些簡單的字符串分析咱們可以自已處理。


[ sscanf/scanf正則使用方法]




補充:sscanf,scanf。fscanf中的正則表達式

每種語言都對正則表達式有着不一樣程度的支持。在C語言中,有輸入功能的這三個函數對正則表達式的支持並不強大。但是咱們仍是有必要了解一下。
首先來看看他們的原型:
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
均可以接受變參。sscanf與scanf相似。可以將標準輸入(stdin)做爲輸入源。最關鍵的部分,就是format這個參數了。它可以是一個或者多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}。
參數解釋:

  一、 * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中)

  二、{a|b|c}表示a,b,c中選一。[d],表示可以有d也可以沒有d。

  三、width表示讀取寬度。

  四、{h | l | I64 | L}:參數的size,一般h表示單字節size。I表示2字節 size,L表示4字節size(double例外),l64表示8字節size。

  五、type : 就是%s,%d之類。

  六、特別的:%*[width] [{h | l | I64 | L}]type 表示知足該條件的被過濾掉,不會向目標參數中寫入值

支持的集合操做:%[a-z] 表示匹配a到z中隨意字符。貪婪性(儘量多的匹配)%[aB'] 匹配a、B、'中一員,貪婪性%[^a] 匹配非a的隨意字符,貪婪性

返回值
這三個函數返回成功匹配和分配的輸入項。意思就是你在format參數列表中的格式。返回值可以比你提供的匹配項目數少(有些將會匹配失敗)。提早匹配失敗則返回0。

假設達到文件末尾。則返回EOF,當錯誤發生的時候也將返回EOF。你可以經過輸出errno來查看錯誤代碼。

假設使用fscanf來推斷文件是否結束,將會存在安全隱患,假設每次讀取的時候都是匹配失敗,那麼返回值永遠都不會是EOF。

scanf族的函數都是要先將數據讀入緩衝區。而後在衝緩衝裏讀取。


注意:scanf族函數會忽略一行開始的空白
from:http://blog.csdn.net/pipisorry/article/details/37073843

相關文章
相關標籤/搜索