soj1103:IP判断_情况巨多的水题

本文介绍了一个用于验证IP地址格式正确性的C++算法实现。通过逐段解析并检查IP地址的有效性,确保每部分都在0到255之间且不包含非法字符。该算法能够有效处理各种边界情况。

http://acm.scu.edu.cn/soj/problem.action?id=1103

可以写的更简洁干练一点,不过太麻烦,懒得改,备注一下吧,防止以后忘记

#include<cstdio>
#include<cstring>
using namespace std;
char str[40];
int main()
{
    while(~scanf("%s",&str))
    {
        int count = 0;
        int flag = -1;
        int len = strlen(str);
        for(int i = 0; i < len; i++)
        {
            if(str[i] == '.'&& i != 0)            //防止第一位就是.  比如.1.2.3.4
            {
                if(str[i-1] > 57 || i-flag > 4)   //数字每一位最大为9, 9+'0' = 57,所以如果 > 57 则为字母
                    break;                        //当数字很大溢出会小于题目给的255,比如1.1.1.4294967297 100000000000.2.3.4,所以直接用位数判断很方便
                int k = 1;
                int sum = 0;
                int ok = 0;
                for(int j = i-1; j > flag; j--)
                {
                    sum += (str[j]-48)*k;
                    k = 10*k;
                    ok = 1;
                    if(sum > 255) break;
                    //printf("2::::%d %d %d\n",i,j,sum);
                }
                if(sum!= 0 && sum == sum-(str[flag+1]-48)*k)     //判断首位是不是0开头但不全是0,比如 01.2.3.4 不可以,1.2.3.4 可以
                    break;

                if(sum <= 255&&sum >=0 && ok)
                {
                    count++;
                    //printf("3::::%d %d \n",sum,count);
                }

                else
                    break;

                flag = i;
            }
        }
        int k = 1;
        int sum = 0;
        int ok = 0;
        for(int i = len-1; i >= flag+1; i--)                 //最后一个点之后也要判断,没有值或者字母或者溢出都要判断
        {
            if(len-flag > 4 || str[i] > 57) break;
            sum += (str[i]-48)*k;
            k = 10*k;
            ok = 1;
        }
        if(sum <= 255&&sum >=0) count++;
        if(count == 4 && ok)                                //一共四个点
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}
真的是烦,很简单的一道题,还是多亏了discuss里面各位大神给出的测试数据了,跪了跪了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值