入力値の検証と再入力


プログラムには、常に正しい入力がされるとは限りません。

例えば、「階乗」の階乗プログラムでは、負の数の階乗はない(厳密には違うようですが今回はないということで)ため、入力値に「0以上の整数」という条件を設けました。つまり、負の数が入力されたらエラーにならなくてはなりません。

しかし、実際のプログラムでは負の数が入力されてもエラーにならず、どの負の数でも階乗が「1」として出力されてしまいます。

 

入力値が不正である場合は処理をしない、というプログラムは簡単にできます。if文で条件分岐をすれば良いだけですね。

しかし、入力値が不正の場合は何もせずに終了!というのは、不親切ですしイライラの元です。

そこで、入力値が不正である限り、再入力を促すというものがよくあります。

これなら、間違えてもすぐに入力し直せばよいので、イライラもしなくて済みますね。

 

今回は、入力値の検証と再入力のプログラムを見ていきます。

1.入力値の検証と再入力の基本


再入力の処理は、「複数回入力」の処理に似ています。

今回は不正な入力値である限り、繰り返し入力待ち状態にすればよいのです。

下記は「0以上の数が入力されるまで再入力を促す」プログラムです。


再入力1(C)



#include <stdio.h>
int main(void){
    int num;

    printf("0以上の整数を入力:");
    scanf("%d", &num);
    while(num < 0){
        printf("0以上の整数を入力:");
        scanf("%d", &num);
    }

    printf("入力値:%d\n", num);
    return 0;
}

再入力1(Java)

import java.util.Scanner;
public class Retype{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int num;

        System.out.print("0以上の整数を入力:");
        num = sc.nextInt();
        while(num < 0){
            System.out.print("0以上の整数を入力:");
            num = sc.nextInt();
        }

        System.out.println("入力値:" + num);
    }
}


実行結果(例)

0以上の整数を入力:-7

0以上の整数を入力:4

入力値:4

2.再入力とdo-while文


複数回入力の時と同様に、上記のプログラムもdo-while文を使うことで短縮できます。

下記は、「再入力1」の入力処理部分6行(7~12行目)をdo-while文で置き換えたものです。実行結果は同じになります。


再入力2(C)

    do{
        printf("0以上の整数を入力:");
        scanf("%d", &num);
    }while(num < 0);

再入力2(Java)

        do{
            System.out.print("0以上の整数を入力:");
            num = sc.nextInt();
        }while(num < 0);


かなりスッキリしましたね。

do-while文は、今回のような再入力処理には打ってつけの構文です。

3.フールプルーフとバリデーション


今回のプログラムのように、使用者が誤った操作をしても、危険な状況になったり不具合が発生したりしないように設計することを、
「フールプルーフ(fool proof)」と言います。

また、入力値の検証を行うことを「バリデーション(validation)」と言います。

どちらも、ソフトウェア開発では大変重要なことです。