题目描述
输入一串字符,判断该字符串是否为点分十进制的 IP 地址,若是则转换为 16
进制输出,否则输出 Error。
样例
输入样例1:
192.41.6.20
输出样例1:
0xC0290614
输入样例2:
257.32.23.1
输出样例2:
Error
#include<bits/stdc++.h>
//#include<iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
bool check(string str){
int cnt=0,sum=0;
for(int i=0;i<str.size();i++){
if(sum>255) return false;
if((str[i]<'0'||str[i]>'9')&&str[i]!='.') return false;
if(str[i]>='0'&&str[i]<='9') sum = sum*10 + (str[i]-'0');
else if(str[i]=='.'){
if(str[i+1]=='.') return 0; // 避免出现连续两个点的情况
cnt++;
sum=0;
}
}
if(cnt!=3) return false;
return true;
}
string fun(string str){
string res;
char num[1010];
int sum=0,cnt=0;
for(int i=0;i<str.size();i++){
if(str[i]=='.'){
sprintf(num,"%02X",sum); //X要大写,因为测试案例里是让大写
res += num;
sum=0;
}
else sum = sum*10 + (str[i]-'0');
if(i==str.size()-1){
sprintf(num,"%02X",sum);
res += num;
return res;
}
}
}
int main(int argc, char** argv) {
string str;
getline(cin,str);
if(check(str)) cout<<"0x"<<fun(str);
else cout<<"Error";
return 0;
}