SSophiaHealious 2019-11-30 01:02 采纳率: 100%
浏览 1087
已采纳

对于每一个输入,单独输出一行。如果该字符串是合法的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^,循环的过程里面有变量的值改变了,我忘了在循环开始的时候初始化。不过还是谢谢大家的想法,我学到了很多呢!

  • 写回答

3条回答 默认 最新

  • threenewbee 2019-11-30 17:01
    关注
    用正则表达式,1行搞定
    参考:https://blog.csdn.net/firstboy0513/article/details/5467529
    把其中的正则换成匹配ip的
    (2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条