ตรวจสอบว่า String เป็น IPv4 Address ที่ถูกต้องหรือไม่
IPv4: 4 ส่วนคั่นด้วยจุด (.) แต่ละส่วน 0-255, ไม่มี Leading Zero (ยกเว้น 0 เอง)
อัลกอริทึม
- แยกสตริงด้วย '.' ต้องได้ 4 ส่วน
- แต่ละส่วน: ต้องเป็นตัวเลขทั้งหมด, ไม่มี 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)
#includebool 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); }