L1-203-IP地址(10分)
题目要求: 编写一个函数判断一个字符串是IPv4地址还是IPv6地址或者两者都不是。 IPv4地址以十进制格式表示,它由四个十进制数组成,每个数字范围从0到255,以点(“.”)分隔,例如127.0.0.1; IPv6地址以十六进制格式表示,它由八个四位的十六进制数组成,以冒号(“:”)分隔,例如: 2000:08db:85a3:0020:0000:8a2e:0370:7334就是合法的 IPv6地址。 我们可以省略一些前导零或者把字母以大写字母表示,所以2000:08DB:85A3:0020:0:8A2E:0370:7334也是合法的IPv6地址。 输入 输入一个地址 输出 如果是IPv4地址,则输出IPv4,如果是IPv6地址则输出IPv6,都不是的话输出Neither 样例输入 172.16.254.1 样例输出 IPv4
解题思路: 字符串操作,将 IP 地址的每一个部分找出并加以判断即可,写两个函数分别判 IPv4 和 IPv6。
需要注意: 题目中的可以省略一些前导零,意思是如果 IPv6 中有一个部分为 0000,那么我们可以把她写作 0。否则 IPv6 地址的每一个部分都必须是 4 位的十进制数。
通关代码:
代码语言:javascript复制#include <iostream>
#include <string>
using namespace std;
bool isIpv4(string str) {
int n = 0;
string value;
string::iterator p = str.begin();
string::iterator END = str.end();
for (; p != END; p ) {
value = *p;
if (*p == '.' || (*p <= '9' && *p >= '0')) {
if (*p == '.' || p == END - 1) {
n ;
if (atoi(value.c_str()) < 0 || atoi(value.c_str()) > 255) {
return false;
}
value = "";
}
} else {
return false;
}
}
if (n != 4) {
return false;
}
return true;
}
bool isIpv6(string str) {
int n = 0;
string value;
string::iterator p = str.begin();
string::iterator END = str.end();
for (; p != END; p ) {
value = *p;
if (*p == ':' || (*p >= '0' && *p <= '9') || (*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) {
if (*p == ':') {
n ;
value.pop_back();
if (value.size() != 4 && value != "0") {
return false;
}
value = "";
} else if (p == END - 1) {
n ;
if (value.size() != 4 && value != "0") {
return false;
}
}
} else {
return false;
}
}
if (n != 8) {
return false;
}
return true;
}
int main() {
string str;
cin >> str;
if (isIpv4(str)) {
cout << "IPv4";
} else if (isIpv6(str)) {
cout << "IPv6";
} else {
cout << "Neither";
}
return 0;
}
通关截图: