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

【C言語】IPアドレスの妥当性を検証するプログラムの作成方法

この記事では、C言語を使ってIPアドレスの妥当性を検証する方法を解説します。入力された文字列が正しいIPv4アドレスの形式に合致しているかどうかを、プログラムで自動的に判定します。

IPv4アドレスの形式

IPv4アドレスは「ドット・デシマル記法」と呼ばれる形式で表現されます。これは、0から255までの範囲にある10進数4つを、3つのドット(.)で区切って表記するものです。

有効なIPアドレスの例:192.168.4.1

IPアドレスを検証する手順

  • ドット「.」を区切り文字として、文字列(IPアドレス)をトークンに分割する
  • 部分文字列に数値以外の文字が1つでも含まれていれば、無効(false)を返す
  • 各トークンの数値が0〜255の範囲外であれば、無効(false)を返す
  • ドットがちょうど3つ、かつ部分文字列が4つであれば、有効なIPアドレスと判定する

サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int validate_number(char *str) {
    while (*str) {
        if (!isdigit(*str)) { // 数値以外の文字なら 0 を返す
            return 0;
        }
        str++; // 次の文字へ進む
    }
    return 1;
}

int validate_ip(char *ip) { // IPアドレスが有効かどうかを判定
    int i, num, dots = 0;
    char *ptr;
    if (ip == NULL)
        return 0;
    ptr = strtok(ip, "."); // ドットを区切り文字として文字列を分割
    if (ptr == NULL)
        return 0;
    while (ptr) {
        if (!validate_number(ptr)) // 部分文字列が数値のみか確認
            return 0;
        num = atoi(ptr); // 部分文字列を数値に変換
        if (num >= 0 && num <= 255) {
            ptr = strtok(NULL, "."); // 文字列の次の部分を取得
            if (ptr != NULL)
                dots++; // ドットのカウントを増やす
        } else
            return 0;
    }
    if (dots != 3) // ドットの数が3でなければ 0 を返す
        return 0;
    return 1;
}

int main() {
    char ip1[] = "192.168.4.1";
    char ip2[] = "172.16.253.1";
    char ip3[] = "192.800.100.1";
    char ip4[] = "125.512.100.abc";
    validate_ip(ip1) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip2) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip3) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip4) ? printf("Valid\n") : printf("Not valid\n");
}

実行結果

Valid
Valid
Not valid
Not valid

コードの解説

このプログラムは、大きく分けて2つの検証関数で構成されています。

validate_number関数

引数として受け取った文字列を1文字ずつ走査し、isdigit()を使ってすべての文字が数字であるかを確認します。数字以外の文字が1つでも見つかった時点で0(無効)を返します。

validate_ip関数

strtok()を使ってIPアドレスの文字列をドットごとに分割し、各部分をvalidate_number()で検証した後、atoi()で数値に変換して0〜255の範囲内かをチェックします。さらにドットの個数をカウントしており、最終的にドットが3つ(=4つの部分に分割されている)であることを確認して有効性を判定します。

テストケースについて

main関数では4つのテストケースを用意しています。「192.168.4.1」と「172.16.253.1」は正しい形式のため有効と判定されます。一方、「192.800.100.1」は800が255を超えているため、「125.512.100.abc」は512が範囲外であることに加え、英字「abc」が含まれているため、それぞれ無効と判定されます。

  1. 【JavaScript入門】クライアントのIPアドレスを取得する方法とサンプルコード

    Webアプリケーションを開発していると、サイト訪問者のパブリックIPアドレスを取得したい場面があります。しかし、JavaScriptにはブラウザから直接IPアドレスを取得する標準APIが用意されていないため、外部のIP検索サービスを利用するのが一般的です。 実装の仕組み 本記事では、ipinfo.ioが提供するJSONP形式のAPIを使用して、クライアントのIPアドレスを取得する方法を紹介します。JSONPを利用することで、同一生成元ポリシー(クロスオリジン制約)を回避しながら、別ドメイン上のデータを受け取ることができます。 サンプルコード <!DOCTYPE html> <

  2. C言語でポインタの使い方を学べるサンプルプログラムを作成する

    ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数のことです。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラミングを可能にします。 ポインタの特徴 ポインタを使うことでメモリ空間を節約できます。 メモリ上の場所へ直接アクセスできるため、実行速度が速くなります。 ポインタを利用すると、メモリへのアクセスが効率化され、動的なメモリの割り当て(確保)と解放が可能になります。 連結リストや木構造などのデータ構造でもポインタが広く使われています。 ポインタの宣言 int *p; これは「p」がポインタ変数であり、別の整数型変数のアドレ