#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);
    

    参数说明

  • str:要转换的字符串
  • idx:可选参数,指向 size_t 的指针,用于存储第一个未转换字符的位置
  • base:可选参数,进制(2-36),默认为10