输入一串字符,判断该字符串是否为点分十进制的IP地址,若是则转换为16进制输出,否则输出“Error”

例如

输入:192.41.6.20

输出:0xC0290614

输入:257.32.23.1

输出:Error

输入描述:
按题意输入。
注意:输入可能是任意的一个字符串,比如“abc.bas.fefe.4r4”或者“23.23.11.23.123”
这都是不合法的IP地址
#include <stdio.h>
#include <string.h>

int main(){
	char s[100]={'\0'};
	gets(s);
	int n=strlen(s);
	if(n>15)
	{	printf("Error");
	    return -1;
	}
	int pot[5]={-1,-1,-1,-1}; //记录每个.的位置包括首尾
	pot[4]=n;
	int sumpot=0;
	for(int i=0;i<n;i++)
	{
		if(s[i]<'0'||s[i]>'9')   //检查非数字和.
		{   if(s[i]!='.')
			{	printf("Error");
				return -1;
			}
		}
		if(s[i]=='.')         //检查.是否超过3个
		{
			sumpot++;
			if(sumpot>3)
			{	printf("Error");
				return -1;
			}
			pot[sumpot]=i;
		}
	}
	int num[3]={0};   //记录每两.之间的每个数字
	int snum[4]={0};  //记录每两.之间的数
	int sumnum=0;
	for(int i=0;i<4;i++)   //检查是否超过255
	{
		int times=pot[i+1]-pot[i]-1;
		for(int j=0;j<times;j++)
		{
			sumnum++;
			if(sumnum>3)
			{	printf("Error");
				return -1;
			}
			num[sumnum-1]=(int)s[j+pot[i]+1]-48;
		}
		switch(sumnum)
		{	case 1:snum[i]=num[0];break;
			case 2:snum[i]=10*num[0]+num[1];break;
			case 3:snum[i]=100*num[0]+10*num[1]+num[2];break;
		}
		if(snum[i]>255||snum[i]<0)
			{	printf("Error");
				return -1;
			}
		sumnum=0;    //将sumnum和num[]清零
		for(int i=0;i<3;i++)
			num[i]=0;
	}
	printf("0x%02X%02X%02X%02X",snum[0],snum[1],snum[2],snum[3]);

	
}

运行结果:

正确输入

若错误输入:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值