C++判斷IP地址字符串的合法性

       最近改BUG,需要對一個IP地址字符串進行合法性檢查,由於時間充裕,所以多折騰了下。
       目前的解決方法可以歸爲以下三類:
1、自己動手寫:以'.'將IP字符串分割成子串,再依次判斷每個子串的每個字符是否都是數字,最後轉換成值,判斷是否在0~255的範圍。

       分割子串的時候可以考慮用C函數中的strtok()函數。這個函數第一次調用的時候(strtok(char *str, const char *sp))返回str分割出的第一個子串,第二次及以後調用的時候(strtok(NULL,const char *sp))依次返回str分割出來的第二個及以後的子串。用這個方法的時候需要注意的是,若用來分割的字符連在一起的時候並不能像我們想象中的那樣分割出空的子串。例如,“192...168.0..101”被分割爲“192” “168” “0” “101”。我們可以在分割之前先判斷'.'的個數,再進行分割,最後轉換成數值判斷範圍。

       我看到一名網友給出的解決方案也狠不錯,充分利用了atoi函數的特性:遇到有字符的時候,只轉換字符前的數字;轉換完畢把字符串數組指針向後移。這招真的狠妙啊!

2、巧用網絡字節序轉換的函數(inet_addr(const char * str))。丟給這個函數一個字符串,能成功轉換就是合法的IP地址字符串,轉換失敗返回INADDR_NONE。若是不允許非標準形式的IP地址,則再加上對'.'的個數的判斷。另外,INADDR_NONE即爲255.255.255.255,因此此地址字符串不能正確轉換。

3、利用正則表達式!這個編寫代碼的效率又高又容易保證正確性,又容易維護(我覺得是……)。因爲項目正好已經有boost的環境,所以我採用了boost中的regex庫。唯一的缺點是,這是個靜態鏈接庫,編譯的時候會慢一點,打包的時候體積也會增加。而我們項目本來就蠻大,編譯已經比較費時了,不宜再添加靜態庫的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章