OJ刷题记录:L1-203-IP地址(10分)

2020-10-29 10:51:41 浏览数 (1)

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;
}

通关截图:

0 人点赞