#include<iostream>
#include<vector>
#include<unordered_map>
#include <sstream>
using namespace std;
string solve(string IP) {
int n = IP.length();
int flag = 0;
string a = "";
int start = 0;
for (int i = 0; i <= n; i++) {
if (IP[i] == '.'||(flag == 1 && i == n)) {
string segment = IP.substr(start, i-start);
if (segment[0]=='0') {
return "Neither";
}
//创建输入字符串流(std::istringstream iss) :
// std::istringstream iss(...):创建一个输入字符串流iss,其内容是上面提取的子字符串。
// std::istringstream是一个C++标准库类,可以用来将字符串当作输入流来处理,类似于从文件或标准输入读取数据。
std::istringstream iss(IP.substr(start, i-start ));
//这里声明并初始化一个整数变量num为0,用于存储从字符串片段转换得到的整数
int num = 0;
//iss >> num:尝试从字符串流iss中读取一个整数,并存储在num中。操作符>>会尝试将字符串转换为指定类型(这里是整数)。
//!(iss >> num):如果转换失败,流状态会变为无效,此时!(iss >> num)为true,表示转换失败。
//iss.eof():检查流是否已经到达末尾(end - of - file)。如果转换成功并且没有多余字符,iss.eof()应为true。
//!iss.eof():如果流中还有未处理的字符,表示转换后流中有多余字符,此时!iss.eof()为true,表示转换不完全。
if (!(iss >> num) || !iss.eof()) {
std::cerr << "Invalid input: " << segment << std::endl;
}
else {
// 检查数字是否在 0 到 255 范围内
if (num >= 0 && num <= 255) {
flag = 1;
start = i + 1;
}
else {
return "Neither";
}
}
}
else if (IP[i] == ':') {
if (i == n-1) {
return "Neither";
}
if (IP[i + 1] == ':') {
return "Neither";
}
if (IP[start] == '0' && IP[start+1] == '0') {
return "Neither";
}
start = i + 1;
flag = 2;
}
else if (flag == 2 && i == n) {
return "IPv6";
}
else {
if (!(((IP[i]- '0') >= 0 && (IP[i]-'0') <= 9) || (IP[i] >= 'A' && IP[i] <= 'F') || (IP[i] >= 'a' && IP[i] <= 'f'))) {
return "Neither";
}
continue;
}
}
if (flag == 1) {
return "IPv4";
}
else {
return "IPv6";
}
}
int main() {
int n = 0;
string s = "";
string IP = "";
cin >> IP;
s=solve(IP);
cout << s << endl;
}
ACM模式
核心代码模式直接把string solve函数复制进牛客网代码框即可。
笔记
1.字符串转数字:使用输入字符串流。头文件:#include<sstream>
2.数字字符转数字:数字字符-’0‘;
3判断是否为是十六进制字符(A-F或a-f):IP[i]>='A'&&IP[i]<='F';IP[i]>='a'&&IP[i]<='f';