Hello,
The class below is one way to implement a class that can read IP address from user’s input in C++;
Can convert to string or/and enumerate in range:
#include <iostream> #include <string> #include <vector> #include <sstream> #include <array> using namespace std; class ipv4 { std::array<unsigned char, 4> data; public: constexpr ipv4() : data{{0}} {} constexpr ipv4(unsigned char const a, unsigned char const b, unsigned char const c, unsigned char const d) : data{{a, b, c, d}} {} explicit constexpr ipv4(unsigned long a) : data{{static_cast<unsigned char>((a >> 24) & 0xFF), static_cast<unsigned char>((a >> 16) & 0xFF), static_cast<unsigned char>((a >> 8) & 0xFF), static_cast<unsigned char>(a & 0xFF)}} {} ipv4(ipv4 const &other) noexcept : data(other.data) {} ipv4 &operator=(ipv4 const &other) noexcept { data = other.data; return *this; } std::string to_string() const { std::stringstream sstr; sstr << *this; return sstr.str(); } constexpr unsigned long to_ulong() const noexcept { return (static_cast<unsigned long>(data[0]) << 24) | (static_cast<unsigned long>(data[1]) << 16) | (static_cast<unsigned long>(data[2]) << 8) | static_cast<unsigned long>(data[3]); } friend std::ostream &operator<<(std::ostream &os, const ipv4 &a) { os << static_cast<int>(a.data[0]) << '.' << static_cast<int>(a.data[1]) << '.' << static_cast<int>(a.data[2]) << '.' << static_cast<int>(a.data[3]); return os; } friend std::istream &operator>>(std::istream &is, ipv4 &a) { char d1, d2, d3; int b1, b2, b3, b4; is >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4; if (d1 == '.' && d2 == '.' && d3 == '.') a = ipv4(b1, b2, b3, b4); else is.setstate(std::ios_base::failbit); return is; } ipv4 &operator++() { *this = ipv4(1 + to_ulong()); return *this; } ipv4 &operator++(int) { ipv4 result(*this); ++(*this); return *this; } friend bool operator==(ipv4 const &a1, ipv4 const &a2) noexcept { return a1.data == a2.data; } friend bool operator!=(ipv4 const &a1, ipv4 const &a2) noexcept { return !(a1 == a2); } friend bool operator<(ipv4 const &a1, ipv4 const &a2) noexcept { return a1.to_ulong() < a2.to_ulong(); } friend bool operator>(ipv4 const &a1, ipv4 const &a2) noexcept { return a2 < a1; } friend bool operator<=(ipv4 const &a1, ipv4 const &a2) noexcept { return !(a1 > a2); } friend bool operator>=(ipv4 const &a1, ipv4 const &a2) noexcept { return !(a1 < a2); } ipv4 &operator+(int i) { //cout << "adding" << i << endl; *this = ipv4(i + to_ulong()); return *this; } }; int main() { ipv4 address(168, 192, 0, 1); std::cout << address << std::endl; ipv4 ip; std::cout << ip << std::endl; std::cin >> ip; string test_ip = ip.to_string(); if (!std::cin.fail()) std::cout << ip << std::endl; cout << "IP: " << test_ip << endl; cout << "Next IP: " << ip++ << endl; cout << "Next 5th IP: " << ip + 5 << endl; return 0; }
Hope this helps and good luck.
— Saeed 🙂
BTC: bc1qrxmjgsc5a2fwn7zplpcu7665uq39tp2ss7luwk