题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 多行注释 ctrl+/
/*char *token
 token = strtok(str, "分割符");
  while( token != NULL ) {
     printf( "%s\n", token );
     token = strtok(NULL, "分割符");
   }
 */
//原字符串str的改动是分割符原位置均更改为 '\0',内容还在,可以通过逐个字符打印检验。
//但输出 %s str 是第一个子字符串
//理解strtok分成两部分 第一个子字符串  剩余存入NULL 所以会有循环取用

//分割+合格的被存储
//计算坐标
// strtok_r linux平台strtok函数线程安全版。
// windows下的对应安全函数为strtok_s

// ABCDE
// Err
// Priv
// 1.~分割 .分割 子网掩码是否合法
// 2.ip是否合法
// 3.ip范围

//atoi 字符串转数字 注意空字符串和不能转换的会被判为0
//警告:字符串比较要用strcmp  只有单个字符可以用==


//sscanf(str,"%d.%d",&a,&b);
int ip_islegal(int ip[], int n);
int dns_islegal(int dns[], int n);

int main()
{
	int A = 0, B = 0, C = 0, D = 0, E = 0, Err = 0, Priv = 0;
	int ip[4], dns[4];
	memset(ip, -1, 4);
	memset(dns, -1, 4);
	char str[200];

	while (scanf("%s", str) != EOF)
	{
        memset(ip, -1, 4);
	    memset(dns, -1, 4);
		sscanf(str, "%d.%d.%d.%d~%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3, dns, dns + 1, dns + 2, dns + 3);
	if(ip[0]==0 ||ip[0]==127)
        continue;
        if (dns[3] == -1 || ip_islegal(ip, 4) == 0 || dns_islegal(dns, 4) == 0)
			Err++;
		else
		{
			if (ip[0] >= 1 && ip[0] <= 126)
				A++;
			else if (ip[0] >= 128 && ip[0] <= 191)
				B++;
			else if (ip[0] >= 192 && ip[0] <= 223)
				C++;
			else if (ip[0] >= 224 && ip[0] <= 239)
				D++;
			else if (ip[0] >= 239 && ip[0] <= 255)
				E++;

			if (ip[0] == 10)
				Priv++;
			else if (ip[0] == 172)
			{
				if (ip[1] >= 16 && ip[1] <= 31)
					Priv++;
			}
			else if (ip[0] == 192)
			{

				if (ip[1] == 168)
					Priv++;
			}
		}
	}

	printf("%d %d %d %d %d %d %d", A, B, C, D, E, Err, Priv);
	return 0;
}

// itoa():
//atoi()
//

int ip_islegal(int ip[], int n)
{
	int ret = 1;
	for (int i = 0; i < n; i++)
	{
		if (ip[i] < 0 || ip[i] > 255)

		{
			ret = 0;
			break;
		}
	}
	return ret;
}

int dns_islegal(int dns[], int n)
{
	int ret = 1;
	int num[9];
	memset(num, 0, 9);
	if (dns[0] != 255)
		ret = 0;
	int i = 0;	  //255个数
	int flag = 0; //是否开始出现非零数 所以只能为0
	for (int l = 0; ret == 1 && l < n; l++)
	{
        
        if (flag==0 && dns[l] == 255)
			i++;
		else if (flag == 0)
		{
			flag++;
			ret = 0;
			for (int j = 128, k = 1; j >= 1; j /= 2, k++)
				num[k] = num[k - 1] + j;
			for (int j = 0; j < 9; j++)
				if (dns[l] == num[j])
                {ret = 1;
                 break;}
		}
		else
		{
			if(dns[l]!=0){
               ret = 0;
                 break; 
            }
		}
	}
	if (i == 4)
	{
		ret = 0;
	}
	return ret;
}
全部评论
46,47行为啥只填充了ip[0]和dns[0]呢,memset(ip, -1, 4)填充4字节的空间,为啥不是将整个数组填充了初始化呢? 虽然不影响结果,但是我不是很理解为啥
1 回复 分享
发布于 2022-05-12 10:02

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
12 4 评论
分享
牛客网
牛客企业服务