Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Validate IP Address (IPv4) ใน C++

ตรวจสอบว่า String เป็น IPv4 Address ที่ถูกต้องหรือไม่

IPv4: 4 ส่วนคั่นด้วยจุด (.) แต่ละส่วน 0-255, ไม่มี Leading Zero (ยกเว้น 0 เอง)

อัลกอริทึม

  1. แยกสตริงด้วย '.' ต้องได้ 4 ส่วน
  2. แต่ละส่วน: ต้องเป็นตัวเลขทั้งหมด, ไม่มี Leading Zero, ค่า 0-255

ตัวอย่างโค้ด (ปรับปรุงจากต้นฉบับ)

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;

bool isValidOctet(const string& s) {
    if (s.empty() || s.size() > 3) return false;
    // Leading zero check
    if (s.size() > 1 && s[0] == '0') return false;
    // All digits
    for (char c : s) if (!isdigit(c)) return false;
    // Range check
    int val = stoi(s);
    return val >= 0 && val <= 255;
}

vector split(const string& str, char delim) {
    vector parts;
    size_t start = 0, end = 0;
    while ((end = str.find(delim, start)) != string::npos) {
        parts.push_back(str.substr(start, end - start));
        start = end + 1;
    }
    parts.push_back(str.substr(start));
    return parts;
}

bool validateIP(const string& ip) {
    vector parts = split(ip, '.');
    if (parts.size() != 4) return false;
    for (const string& part : parts)
        if (!isValidOctet(part)) return false;
    return true;
}

int main() {
    string ip;
    cout << "Enter IP Address: ";
    cin >> ip;

    if (validateIP(ip))
        cout << "*** Valid IP Address ***\n";
    else
        cout << "*** Invalid IP Address ***\n";

    return 0;
}

ผลลัพธ์ตัวอย่าง

Enter IP Address: 10.10.10.2
*** Valid IP Address ***

Enter IP Address: 256.1.1.1
*** Invalid IP Address ***

Enter IP Address: 192.168.001.1
*** Invalid IP Address *** (Leading zero)

ปรับปรุงจากโค้ดต้นฉบับ

  • เพิ่มการตรวจสอบ Leading Zero (01, 001 ไม่ถูกต้อง)
  • ใช้ isdigit แทน Regex ที่ซับซ้อน
  • จัดการ Error ของ stoi ได้ดีขึ้น
  • รองรับ IPv6 ได้ด้วยการขยาย Logic

Regex Version (C++11)

#include 
bool validateIPRegex(const string& ip) {
    regex pattern(R"(^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$)");
    return regex_match(ip, pattern);
}