题目描述:

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

注意本题有多组样例输入。

输入描述:

输入一个ip地址,保证是xx.xx.xx.xx的形式(xx为整数)

输出描述:

返回判断的结果YES or NO

示例:

输入:

10.138.15.1
255.0.0.255
255.255.255.1000

输出:

YES
YES
NO

解题思路:

1、地址分四段,且必须有四段
2、dot 有三个,且必须三个
3、每段数字在 0 - 255 之间
4、每段数字长度大于 0,少于 3

测试用例:

10.128.1.156.1
10.128.1.
10.128.1.156.
256.0.0.0
10.1111.1.1
1..0.122
12.a.89.1
255.255.255.255
0.0.0.0

题解 - C 语言

int main()
{
    char ip[20];
    while (scanf("%s", ip) != EOF) {
        int len = strlen(ip);
        int seg = 0;
        int dot = 0;
        int seg_len = 0;
        for (int i=0; i<len; i++) {
            if (ip[i] >= '0' && ip[i] <= '9') {
                seg_len++;
                seg = seg*10 + ip[i]-'0';
            } else if (ip[i] == '.') {
                if (seg > 255 || seg_len == 0 || seg_len > 3 || (seg==0 && seg_len>1)) {
                    printf("NO");
                    break;
                }
                seg = 0;
                seg_len = 0;
                dot++;
            } else {
                printf("NO");
                break;
            }
        }
        if (seg > 255 || seg_len == 0 || seg_len > 3 || (seg==0 && seg_len>1)) {
            printf("NO");
            break;
        }
        if (dot == 3) {
            printf("YES");
        } else {
            printf("NO");
        }
    }
    return 0;
}