对于每一个输入,单独输出一行。如果该字符串是合法的IP,输出YES,否则, 输出NO

问题描述:

1.问题:IP地址判断

描述

在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。合法的IP是这样的形式:

A.B.C.D

其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不会有前导零存在,如001这种情况。现在,请你来完成这个判断程序吧

输入

输入由多行组成,每行是一个字符串,输入由“End of file”结束。字符串长度最大为30,且不含空格和不可见字符。

输出

对于每一个输入,单独输出一行。如果该字符串是合法的IP,输出YES,否则,
输出NO

样例

输入 输出

202.115.32.24 YES

a.b.c.d NO

End of file

2.我自己写的一段代码

#include <stdio.h>
#include <string.h>
int main() 
{
    char c[35];
    int i, d1, d2, d3, mid, zhi1, zhi2, zhi3, zhi4, oo,gd=0, m;
    while (1)
    {
        for (i = 0; i <= 35; i++)
        {
            c[i] = -1;
        }                            //初始化 

        i = 0; m = 0;
        while (c[m] != '\n')
        {
            c[i] = getchar(); m = i; i++;
        }
        oo = m - 1;

        if (strcmp(c, "End of file") == 0) break;
        else
        {
            for (i = 0; i <= 35; i++)   //字符转成数字
            {
                c[i] = c[i] - 48;
            }
            for (i = 0; i <= oo; i++)
            {
                if ((c[i] >= 10 || c[i] < 0) && c[i] != '.' - 48) gd++;
            }
            if (gd != 0 || (c[oo] < 0 || c[oo]>9))
            {
                mid = 0;
                goto end;
            }
            //找到小数点。格式不符合规范就结束
            for (d1 = 0; d1 <= 35; d1++)
            {
                if (c[d1] == '.' - 48) break;
            }
            for (d2 = d1 + 1; d2 <= 35; d2++)
            {
                if (c[d2] == '.' - 48) break;
            }
            for (d3 = d2 + 1; d3 <= 35; d3++)
            {
                if (c[d3] == '.' - 48) break;
            }
            if (d1 == 36 || d2 == 36 || d3 == 36 || d1 == 0 || d2 - d1 == 1 || d3 - d2 == 1 || d1 >= 4 || d2 - d1 - 1 >= 4 || d3 - d2 - 1 >= 4 || oo - d3 >= 4)
            {
                mid = 0;
                goto end;
            }

            //下面判断输入的值是否符合规范
            //第一段
            if (d1 == 3)
            {
                if (c[0] == 0 || (c[0] == 0 && c[1] == 0)) { mid = 0; goto end; }
                else zhi1 = c[0] * 100 + c[1] * 10 + c[2];
            }
            else if (d1 == 2)
            {
                if (c[0] == 0) { mid = 0; goto end; }
                else
                    zhi1 = c[0] * 10 + c[1];
            }
            else if (d1 == 1)
            {
                zhi1 = c[0];
            }
//第二段
            if (d2 - d1 == 4)
            {
                if (c[d1 + 1] == 0 || (c[d1 + 2] == 0 && c[d1 + 1] == 0)) { mid = 0; goto end; }
                else
                    zhi2 = c[d1 + 1] * 100 + c[d1 + 2] * 10 + c[d1 + 3];
            }
            else if (d2 - d1 == 3)
            {
                if (c[d1 + 1] == 0) { mid = 0; goto end; }
                else
                    zhi2 = c[d1 + 1] * 10 + c[d1 + 2];
            }
            else if (d2 - d1 == 2)
            {
                zhi2 = c[d1 + 1];
            }
//第三段
            if (d3 - d2 == 4)
            {
                if (c[d2 + 1] == 0 || (c[d2 + 1] == 0 && c[d2 + 2] == 0)) { mid = 0; goto end; }
                else
                    zhi3 = c[d2 + 1] * 100 + c[d2 + 2] * 10 + c[d2 + 3];
            }
            else if (d3 - d2 == 3)
            {
                if (c[d2 + 1] == 0) { mid = 0; goto end; }
                else
                    zhi3 = c[d2 + 1] * 10 + c[d2 + 2];
            }
            else if (d3 - d2 == 2)
            {
                zhi3 = c[d2 + 1];
            }
//第四段
            if (oo - d3 == 3)
            {
                if (c[d3 + 1] == 0 || (c[d3 + 1] == 0 && c[d3 + 2] == 0)) { mid = 0; goto end; }
                else
                    zhi4 = c[d3 + 1] * 100 + c[d3 + 2] * 10 + c[d3 + 3];
            }
            else if (oo - d3 == 2)
            {
                if (c[d3 + 1] == 0) { mid = 0; goto end; }
                else
                    zhi4 = c[d3 + 1] * 10 + c[d3 + 2];
            }
            else if (oo - d3 == 1)
            {
                zhi4 = c[d3 + 1];
            }

            if (zhi1 >= 0 && zhi2 >= 0 && zhi3 >= 0 && zhi4 >= 0 && zhi1 <= 255 && zhi2 <= 255 && zhi3 <= 255 && zhi4 <= 255)
            {
                mid = 1;
            }
            else
            {
                mid = 0;
            }

        end:
            if (mid == 0) printf("NO\n");
            else printf("YES\n");
        }
    }
return 0;
}

我试过了各种能想到的情况都是符合题目要求的,但是oj只给我了10.5/30分,我不知道有什么情况没有考虑到,求大神指点^o^。

谢谢大家,解决问题了^o^,循环的过程里面有变量的值改变了,我忘了在循环开始的时候初始化。不过还是谢谢大家的想法,我学到了很多呢!

用正则表达式,1行搞定
参考:https://blog.csdn.net/firstboy0513/article/details/5467529
把其中的正则换成匹配ip的
(2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2}

参考一下这个能跑多少

#include <iostream>
#include <cstring>

using namespace std;

void isIP(char* ip)
{   
    int index = 0;
    int part = 0;
    int lenIP = strlen(ip);
    if (lenIP == 0 || ip[0] == '.')
    {
        cout << ip << "  NO" << endl;
        return;
    }
    while (index < lenIP)
    {
        int j = 0;      
        while (*(ip + index) != '.' && (index < lenIP))
        {
            if (*(ip + index) < '0' || *(ip + index) > '9')
            {
                cout << ip << "  NO" << endl;
                return;
            }
            ++j;
            ++index;
        }
        //计算分段数
        part++;

        int sum = 0;
        //分段回溯,计算分段数值
        while (j > 0)
        {
            sum = sum * 10 + (*(ip + index - j) - '0');
            j--;
        }
        if (sum > 255 || sum < 0)
        {
            cout << ip << "  NO" << endl;
            return;
        }
        ++index;
    }
    if (part == 4)
        cout << ip << "  YES" << endl;
    else
        cout << ip << "  NO" << endl;
}

int main()
{
    while (true)
    {
        char ch[20];
        gets_s(ch);
        isIP(ch);
        if (strcmp(ch, "End of file") == 0)
            break;
    }
    return 0;
}

goto不建议使用。
代码不够简洁,ip中4段的每一段判断方法一样,应该做成一个函数或用循环处理。
为了便于用循环,变量名不要用zhi1、zhi2、zhi3、zhi4,用数组。