1. 程式人生 > >判斷某個字串是否是合法IP

判斷某個字串是否是合法IP

使用的標頭檔案以及巨集定義:

#include <stdio.h>  
#include <string.h>     // strlen()
#include <assert.h>     // assert()
#include <ctype.h>      // digit()

#define FALSE 0
#define TRUE 1
#define BOOL int

函式內容:

BOOL IsValidIpAddress(const char *ip) //不能修改ip指向字串的內容
{
    size_t length = 0;   // 儲存ip字串的長度
int dot = 0; // '.'出現的次數 int value = -1; // 儲存以'.'分隔的每部分字串表示的數值,初始化為-1 int count = 0; // 分隔的每部分字串的長度 char last_ch = '\0'; // 遍歷ip字串時,上一次遍歷過的字元 assert(NULL != ip); //斷言ip不能為空 if (12 + 3 < (length = strlen(ip))) //ip字串的長度不能超過12+3=15 return FALSE; //開始遍歷ip字串
while (*ip) { if (isdigit(*ip)) { if (last_ch == '0') //不能以'0'開頭表示數字 return FALSE; count++; if (count <= 3) //最多有3個連續的數字字元 { if (count == 1) //判斷是否是當前部分的第一個數字字元 value = *ip - '0'
; else value = value * 10 + *ip - '0'; } else return FALSE; } else if (*ip == '.') { if (!isdigit(last_ch)) //判斷'.'之前是不是數字字元,主要防止第一個字元就是'.' return FALSE; if (dot++ > 3) //'.'的個數大於3,不合理 return FALSE; if (0 > value || 255 < value) //判斷'.'之前的整數value是否查出範圍 return FALSE; else { value = 0; //未超出範圍,重置value count = 0; } } else return FALSE; last_ch = *ip; //更新上一個字元 ip++; //繼續往後遍歷 } if (dot == 3 && 0 <= value && 255 >= value) //去掉提前遇見'\0',或者最後一個整數值過大的情況 return TRUE; else return FALSE; }

測試用例:

void Test()
{
    char *ip[20] = { NULL };
    int i = 0;

    ip[0] = "1.1.1.1.1.1";
    ip[1] = "0.0.0.0.3";
    ip[2] = ".1.1.1";
    ip[3] = "1431.1.1.1";
    ip[4] = "441.1.1.1";
    ip[5] = "1.1.1.1e";
    ip[6] = "e1.1.g1.1";
    ip[7] = "221.122.01.1";
    ip[8] = "1...1.1.1";
    ip[9] = "1111.2221.31.1";
    ip[10] = "1.1.\01.1";
    ip[11] = "543.1.1.1";
    ip[12] = "221\0.221.221.221";
    ip[13] = "0001.1.1.";
    ip[14] = "\01.1.1.1";
    ip[15] = "1\0.1.1.1";
    ip[16] = "0.0.0.0";
    ip[17] = "127.0.0.1";
    ip[18] = "221.31.41.16";
    ip[19] = "192.168.0.134";

    for (i = 0; i < 20; i++)
    {
        printf("id %d %s is a valid ip address?", i + 1, ip[i]);

        if (IsValidIpAddress(ip[i]))
            printf("    ----> yse. \n");
        else
            printf("    ----> no \n");
    }
}

int main()
{
    Test();

    return 0;
}