题目描述
输入一串字符,判断该字符串是否为点分十进制的 IP 地址,若是则转换为 16 进制输出,否则输出 Error。
输入格式
一行字符串。
注意,输入可能是任意的一个字符串,比如 abc.bas.fefe.4r4 或者 23.23.11.23.123 这都是不合法的 IP 地址。
输出格式
按题目要求,输出一行结果。
数据范围
输入字符串长度不超过 100。
样例
输入样例1:
192.41.6.20
输出样例1:
0xC0290614
输入样例2:
257.32.23.1
输出样例2:
Error
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
char a[4][N]; // 记录四组数据s1.s2.s3.s4中s1,s2,s3,s4
int num[4]; // 记录s1,s2,s3,s4的十进制数为多少
int main()
{
string s;
cin>>s;
int n=s.size();
bool check=true; // 判断IP地址是否合法
int cnt=0;
// 判断给定字符串是否是合法IP地址
for(int i=0,j=0;i<n;i++)
{
if(s[i]>='0' && s[i]<='9')
{
a[cnt][j]=s[i];
j++;
}
else if(s[i]=='.')
{
cnt++;
j=0;
}
else
{
check=false; // 其他字符不合法
break;
}
// 如果有五组数据或者有两个连续的字符'.',IP地址不合法
if(cnt==4 || s[i]=='.' && s[i+1]=='.')
{
check=false;// 当出现四个字符'.'不合法或者连续两个字符'.'
break;
}
}
if(check) // 如果IP地址合法
{
// 统计cnt+1组数据,转化为十进制
for(int i=0;i<=cnt;i++)
{
int len=strlen(a[i]);
int sum=0,t=1;
for(int j=len-1;j>=0;j--)
{
sum+=(a[i][j]-'0')*t;
t*=10;
}
if(sum>=0 && sum<=255) num[i]=sum;
else // 如果大于255不合法
{
cout<<"Error"<<endl;
return 0;
}
}
// 十进制转化为十六进制
cout<<"0x";
char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
for(int i=0;i<=3;i++)
{
if(i<=cnt)
{
int t=num[i];
if(t<=15)
{
cout<<'0';
cout<<hex[t%16];
}
else cout<<hex[t/16]<<hex[t%16];
}
else cout<<"00";
}
}
else cout<<"Error"<<endl;
return 0;
}