0

int ではなく、他のタイプの入力からプログラムを保護したいと考えています。変数に代入せずに入力の型をチェックする方法は? Cで

4

3 に答える 3

3

strtodstrtol、およびその仲間を参照してください。

これらの関数はすべてendptr、変換が終了した場所を示す out パラメータ (一般に と呼ばれます) を取得します。その情報を使用して、変換したい入力が整数または浮動小数点数であったか、まったく数値ではないかを判断できます。

戦略は、入力を基数 10 の長さとして解析しようとすることです。それが機能しない場合 (つまり、変換されていない文字があった場合)、double として解析するかどうかを確認してください。どちらも機能しない場合、入力は数値ではありません。明らかに、数値に使用する基本型を決定する必要があります。より多くのチェックと改良を組み込むことができますが、ここでは簡単な例を示します。

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

struct a_number {
    unsigned char is_long;
    union {
        double d;
        long i;
    };
};

int main(void) {
    int n;
    char *input_strings[3] = {
        "1234","1234.56", "12asdf"
    };

    struct a_number *numbers[3];

    for (n = 0; n < 3; ++n) {
        char *start = input_strings[n];
        char *end;
        long i = strtol(start, &end, 10);
        if ( *end == '\0' ) {
            struct a_number *num = malloc(sizeof(*num));
            assert( num );
            num->is_long = 1;
            num->i = i;
            numbers[n] = num;
        }
        else {
            double d = strtod(start, &end);
            if ( *end == '\0' ) {
                struct a_number *num = malloc(sizeof(*num));
                assert( num );
                num->is_long = 0;
                num->d = d;
                numbers[n] = num;
            }
            else {
                numbers[n] = NULL;
            }
        }
    }

    for (n = 0; n < 3; ++n) {
        if ( numbers[n] ) {
            if ( numbers[n]->is_long ) {
                printf("%ld\n", numbers[n]->i );
            }
            else {
                printf("%g\n", numbers[n]->d );
            }
        }
    }

    return 0;
}
于 2009-11-08T12:29:39.433 に答える
1

それをchar変数(または文字列)に入れて有効性を確認してから、int変数に入れる必要があります。データをどこかに読み取る必要があります。

于 2009-11-08T12:26:20.793 に答える
0

入力を変数に割り当てないと、これを行うことはできません。

于 2009-11-08T13:09:05.233 に答える