#include<iostream>
#include<string.h>
#include<string>
#include<cstdio>
#include<strings.h>
#include<sstream>
using namespace std;
const string validIPv6Chars = "0123456789abcdefABCDEF";
bool isValidIPv4Block(string& block) {
int num = 0;
if (block.size() > 0 && block.size() <= 3) {
for (int i = 0; i < block.size(); i++) {
char c = block[i];
// special case: if c is a leading zero and there are characters left
if (!isalnum(c) || (i == 0 && c == '0' && block.size() > 1))
return false;
else {
num *= 10;
num += c - '0';
}
}
return num <= 255;
}
return false;
}
bool isValidIPv6Block(string& block) {
if (block.size() > 0 && block.size() <= 4) {
for (int i = 0; i < block.size(); i++) {
char c = block[i];
if (validIPv6Chars.find(c) == string::npos)
return false;
}
return true;
}
return false;
}
string validIPAddress(string IP) {
string ans[3] = {"IPv4", "IPv6", "Invalid"};
stringstream ss(IP);
string block;
// ipv4 candidate
if (IP.substr(0, 4).find('.') != string::npos) {
for (int i = 0; i < 4; i++) {
if (!getline(ss, block, '.') || !isValidIPv4Block(block))
return ans[2];
}
return ss.eof() ? ans[0] : ans[2];
}
// ipv6 candidate
else if (IP.substr(0, 5).find(':') != string::npos) {
for (int i = 0; i < 8; i++) {
if (!getline(ss, block, ':') || !isValidIPv6Block(block))
return ans[2];
}
return ss.eof() ? ans[1] : ans[2];
}
return ans[2];
}
int main()
{
//ifstream in("in5.txt");
//ofstream out("out5.txt");
string IP;
cin>>IP;
string ans = validIPAddress(IP);
cout<<ans<<endl;
}
同学优秀代码:
#include <stdio.h>
#include <string.h>
char a[50];
int main()
{
int n,j=0,k=0,i,c1=0,key=0;
gets(a);
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]==':') j++;
if(a[i]=='.') k++;
}
if(j>0&&j<8&&k==0)//十六进制
{
for(i=0;i<n;i++)
{
if((a[i]>'F'&&a[i]<='Z')||(a[i]>'f'&&a[i]<='z')){c1=1;break;}
if(a[i]!=':')
{
key++;
if(key>4){c1=1;break;}
}
if(a[i]==':'){key=0;}
if(a[i]==':'&&a[i-1]==':'){c1=1;break;}
if((a[i]>'F'&&a[i]<='Z')||(a[i]>'f'&&a[i]<='z')){c1=1;break;}
}
if(c1==0) printf("IPv6");
else printf("Invalid");
}
else if(j==0&&k>0&&k<4)// 十进制
{
for(i=0;i<n;i++)
{
if(a[i]>'9'){c1=2;break;}
if(a[i]=='0'&&(i==0||a[i-1]=='.')){c1=2;break;}
if(a[i]=='2'&&a[i+1]=='5'&&a[i+2]>'5'){c1=2;break;}
if(a[i]=='2'&&a[i+1]>'5'&&a[i+2]>='0'){c1=2;break;}
if(a[i]>'2'&&a[i+1]>='0'&&a[i+2]>='0'){c1=2;break;}
if(a[i]>='0'&&a[i+1]>='0'&&a[i+2]>='0'&&a[i+3]>='0'){c1=2;break;}
}
if(c1<2) printf("IPv4");
else printf("Invalid");
}
else printf("Invalid");
return 0;
}
评论0