C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でIPアドレスの妥当性を検証する方法

この記事では、C++のコードを使ってIP(インターネットプロトコル)アドレスが正しい形式かどうかを検証する方法について解説します。

IPアドレスは32ビットのドット区切り10進表記で構成されており、0から255までの範囲の数値が4つのセグメントに分けられ、それぞれがドット(.)で連結された形をしています。IPアドレスは、ネットワーク上のホストマシンを一意に識別し、マシン同士の接続を確立するために利用される重要な情報です。

ユーザーから入力されたIPアドレスが正しいかどうかを検証するには、以下のアルゴリズムに沿って処理を実装します。

アルゴリズム

START
    Step-1: IPアドレスを入力する
    Step-2: IPアドレスを4つのセグメントに分割し、配列に格納する
    Step-3: 各セグメントが数値であるかどうかを確認する
    Step-4: foreachループで配列リストを走査する
    Step-5: 範囲(256未満)とデータ形式をチェックする
    Step-6: Main() 内でvalidateメソッドを呼び出す
END

このアルゴリズムに基づいて作成したのが以下のC++コードです。文字列が数値形式かどうかを判定する関数、指定した区切り文字で文字列を分割する関数、そしてIPアドレス全体の妥当性を検証する関数という、3つの重要な機能を実装しています。

サンプルコード

#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 渡された文字列が数値文字列かどうかを判定する
bool chkNumber(const string& str){
    return !str.empty() &&
    (str.find_first_not_of("[0123456789]") == std::string::npos);
}
// 指定した区切り文字で文字列を分割する関数
vector<string> split(const string& str, char delim){
    auto i = 0;
    vector<string> list;
    auto pos = str.find(delim);
    while (pos != string::npos){
        list.push_back(str.substr(i, pos - i));
        i = ++pos;
        pos = str.find(delim, pos);
    }
    list.push_back(str.substr(i, str.length()));
    return list;
}
// IPアドレスを検証する関数
bool validateIP(string ip){
    // 文字列をトークンに分割する
    vector<string> slist = split(ip, '.');
    // トークンの数が4つでない場合は不正
    if (slist.size() != 4)
        return false;
    for (string str : slist){
        // 数値であること・正の値であること・範囲内であることを確認
        if (!chkNumber(str) || stoi(str) < 0 || stoi(str) > 255)
            return false;
    }
    return true;
}
// C++でIPアドレスを検証する
int main(){
    cout<<"Enter the IP Address::";
    string ip;
    cin>>ip;
    if (validateIP(ip))
        cout <<endl<< "***It is a Valid IP Address***";
    else
        cout <<endl<< "***Invalid IP Address***";
    return 0;
}

上記のコードを標準的なC++コンパイラでコンパイル・実行すると、以下のような出力が得られます。ここでは、入力された「10.10.10.2」が正しいIPアドレスかどうかを適切に判定できていることがわかります。

実行結果

Enter the IP Address:: 10.10.10.2
***It is a Valid IP Address***

このように、文字列の分割・数値判定・範囲チェックを組み合わせることで、C++でも簡単にIPアドレスの形式検証を実装できます。実際の開発では、先頭のゼロの扱いやIPv6への対応など、要件に応じて検証ロジックを拡張することも可能です。

  1. C++で文字列をトークン化(分割)する2つの方法を解説

    文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string

  2. C#でIPアドレスを検証する方法をわかりやすく解説

    IPアドレス(Internet Protocol Address)とは、コンピュータネットワーク上の各デバイスに割り当てられる一連の数値のことです。ネットワーク通信において、デバイスを一意に識別するために欠かせない情報となっています。C#では、System.Net 名前空間に含まれる IPAddress クラスを使用することで、IPアドレスを簡単に扱うことができます。IPアドレス検証プログラムの例以下は、ユーザーが入力した文字列が有効なIPアドレスかどうかを判定するサンプルプログラムです。using System; using System.Net; using System.Net.Sock