判断输入的IP V4地址字符串是否合法

输入描述:

输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。
接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。
输出描述:
可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。

合法的IP地址为:
a、b、c、d都是0-255的整数。
输入例子:
2
255.255.255.255
512.12.2.3
输出例子:
Yes!
No!
/*这种写法感觉有很多错误喃……如果输入负数?*/
#include <stdio.h>
#include <string.h>
bool checkIP(char *s)
{
    int numOfChar = strlen(s);
    if(numOfChar>15)                 // IP v4  0.0.0.0 ~ 255.255.255.255
        return false;
    int i,dotAdd[3],dotCount = 0;
    for (i = 0; i < numOfChar; i++)      // 找出.所在的下标     可以考虑边判断边动指针i
    {
        if (s[i] == '.')
        {
            dotCount++;
            if (dotCount > 3)
                return false;
            dotAdd[dotCount-1] = i;     // 日常下标减一  常见错误
        }
    }
    if (dotCount != 3)
        return false;
    int num, j;
    for (i = 0; i < dotCount; i++)       // 只判断了.前面的符不符合要求,最后一个数字也要判断
    {
        num = 0,j = 1;                  // 通过.的位置定位其前后的数字字符并转化为数字
        int index = dotAdd[i]-1;        // 定位字符串中的.对其前面的数进行转换和求和操作  index > 0 && s[index] != '.'
        while (index >= 0 && s[index] != '.')
        {
            num = num + j*(s[index] - '0');
            j *= 10;
            index--;
        }
        if (num > 255)
            return false;
    }
     
    int lastDot = dotAdd[2];
    num = 0, j = 1;
    while (s[numOfChar - 1] != '.')
    {
        numOfChar--;
        num = num + j*(s[numOfChar] - '0');
        j *= 10;
    }
    if (num > 255)
        return false;
    return true;
}
int main()
{
    char input[20];
    int n;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%s", input);
        bool a = checkIP(input);
        (a == false) ? printf("No!\n") : printf("Yes!\n");
    }
    return 0;
}


/*另外一种做法*/
#include <stdio.h>
#include <string.h>
bool checkIP(char *s)
{
	int index = strlen(s) - 1;
	if (strlen(s) > 15)							// 0.0.0.0 ~ 255.255.255.255
		return false;
	int i,dotCount = 0;

	for (i = 0; i <= index; i++)			// 判断是否存在非法输入
	{
		if (s[i] == '.')
		{
			dotCount++;
			continue;
		}
		else if (s[i] >= '0' && s[i] <= '9')
			continue;
		else
			return false;
	}
	if (dotCount != 3)						// 合格的ip v4 地址有三个点
		return false;

	// 使指针首先指向字符串的最后一个字符,从后往前扫是为了方便计算
	while (1)
	{
		int num = 0, j = 1;
		while (s[index] != '.' && index >= 0)
		{
			num = num + (s[index] - '0') * j;
			j *= 10;
			index--;
		}
		index--;
		if (num > 255)
			return false;
		if (index < 0)
			break;
	}
	return true;
}
int main()
{
	char input[20];
	int n;
	scanf("%d", &n);
	while (n--)
	{
		scanf("%s", input);
		bool a = checkIP(input);
		(a == false) ? printf("No!\n") : printf("Yes!\n");
	}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值