输入一串字符,判断该字符串是否为点分十进制的IP地址,若是则转换为16进制输出,否则输出“Error”
例如
输入:192.41.6.20
输出:0xC0290614
输入:257.32.23.1
输出:Error
按题意输入。
注意:输入可能是任意的一个字符串,比如“abc.bas.fefe.4r4”或者“23.23.11.23.123”
这都是不合法的IP地址
输入样例
192.41.6.20
输出样例
0xC0290614
#include<stdio.h>
#include<stdlib.h>
//判断字符是不是都是数字
int Judge(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]>=0&&a[i]<=9)
{
return 1;
}
else
{
printf("Error");
return 0;
}
}
}
//对小数点之间的3个数字求和,判断是否是0-255之间的数,并返回结果
int exchange(int a[],int n)
{
int sum=0,i;
if(n==3)
{
sum=a[0]*100+a[1]*10+a[2];
}
if(n==2)
{
sum=a[0]*10+a[1];
}
else if (n==1){
sum=a[0];
}
if(sum>255||sum<0)
{
printf("Error");
return -1;
}
return sum;
}
int main()
{
char str1[100]="";
int i,a[100],j=0,len=0,flag,k=0,res[40],g=0; //a数组接收原始字符、res数组保存两个小数点之间的和、len统计小数点数量、j用来判断a的数组长度、g用来判断res的长度
gets(str1);
for(i=0;str1[i]!='\0';i++)
{
if(str1[i]!='.')
{
len++; //'.'前的字符数量统计
if(len%4==0) //如果'.'的字符大于3,则报错程序结束
{
printf("Error");
return 0;
}
a[j]=str1[i]-'0'; //否则将每个字符存入数组a中
j++; //数组a的长度+1;
}
else{
len=0; //遇到'.',则len清0,进行后续的字符个数统计
k++; //k用来统计'.'的个数
if(k>=4) //如果‘。’大于4,错误,退出程序
{
printf("Error");
return 0;
}
flag=Judge(a,j); //否则,判断数组a是否都是数字
if(flag==1&&exchange(a,j)!=-1) //数组都是数字并且两个‘。’之间的数字处于0-255之间
{
//baocun
res[g++]=exchange(a,j); //将结果保存在res数组中
//将a数组'清空'
j=0;
}
else
{
return 0;
}
}
}
//对最后一个‘。’后面的字符判断
flag=Judge(a,j);
if(flag==1&&exchange(a,j)!=-1)
{
res[g++]=exchange(a,j);
}
else{
printf("Error");
return 0;
}
if(k!=3) //如果小数点个数不等于3个报错并退出
{
printf("Error");
return 0;
}
//否则输出对应的十六进制
printf("0x");
for(i=0;i<g;i++)
{
printf("%02X",res[i]);
}
return 0;
}