输入一串字符,判断该字符串是否为点分十进制的 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
难度:简单
来源:贵州大学考研机试题(Acwing:https://www.acwing.com/)
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
bool check(string s)
{
int cnt = 0;
int cnt1 = 0;
for(int i=0;i<s.size();i++)
{
if(isalpha(s[i])) return false;
if(s[i] == '.') cnt++;
if(isdigit(s[i]))
{
cnt1++;
int j = i;
int x = 0;
while(j<s.size() && isdigit(s[j]))
{
x = x * 10 + s[j] - '0';
j++;
}
if(x > 255) return false;
i = j - 1;
}
if(s[i] != '.' && !isdigit(s[i]) && !isalpha(s[i])) return false;
}
if(cnt != 3 || cnt1 != 4) return false;
return true;
}
string trans(int n)
{
int x = 0;
string ss,c;
if(n == 0) ss = "0";
while(n != 0)
{
x = n % 16;
if(x<10) c = x + '0';
else
{
c = x + 'A' - 10;
}
ss = c + ss;//逆序
n = n / 16;
}
return ss;
}
int main()
{
string s;
cin>>s;
string anss = "0x";
if(check(s))
{
for(int i=0;i<s.size();i++)
{
if(isdigit(s[i]))
{
int j = i;
int x = 0;
while(j<s.size() && isdigit(s[j]))
{
x = x * 10 + s[j] - '0';
j++;
}
i = j - 1;
string ss = trans(x);
//cout<<ss<<endl;
if(ss.size()<2) ss = '0' + ss;
//cout<<ss<<endl;
anss += ss;
}
}
cout<<anss<<endl;
}
else
{
cout<<"Error"<<endl;
}
return 0;
}