#include <sstream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;
class Solution {
public:
string solve(string IP) {
if (IP.find('.') != string::npos && IP.find(':') != string::npos) {
return "Neither";
} else if (IP.find('.') != string::npos) {
return checkIPv4(IP);
} else if (IP.find(':') != string::npos) {
return checkIPv6(IP);
} else {
return "Neither";
}
}
private:
string checkIPv4(const string& IP) {
// 检查开头或结尾是否有 '.'
if (IP.front() == '.' || IP.back() == '.') return "Neither";
vector<string> parts;
stringstream ss(IP);
string part;
while (getline(ss, part, '.')) {
parts.push_back(part);
}
if (parts.size() != 4) return "Neither";
for (const string& p : parts) {
if (p.empty() || p.size() > 3) return "Neither";
if (p.size() > 1 && p[0] == '0') return "Neither";
for (char c : p) {
if (!isdigit(c)) return "Neither";
}
int num = stoi(p);
if (num < 0 || num > 255) return "Neither";
}
return "IPv4";
}
string checkIPv6(const string& IP) {
// 检查开头或结尾是否有 ':'
if (IP.front() == ':' || IP.back() == ':') return "Neither";
vector<string> parts;
stringstream ss(IP);
string part;
while (getline(ss, part, ':')) {
parts.push_back(part);
}
if (parts.size() != 8) return "Neither";
for (const string& p : parts) {
if (p.empty() || p.size() > 4) return "Neither";
for (char c : p) {
if (!isxdigit(c)) return "Neither";
}
}
return "IPv6";
}
};
npos 是 C++ 标准库中定义的一个静态常量,表示"未找到"或"无效位置"。
定义和用途
cpp
static const size_t npos = -1; // 实际上是 size_t 类型的最大值
主要用途
- 字符串查找:当 find() 函数找不到子字符串时返回 npos
- 表示无效位置:作为位置参数的默认值或错误指示
2. stoi - String TO Integer
stoi 是 C++11 引入的函数,用于将字符串转换为整数。
函数原型
cpp
int stoi(const string& str, size_t* idx = 0, int base = 10);

京公网安备 11010502036488号