【问题标题】:how to restrict an input in c如何限制c中的输入
【发布时间】:2010-12-14 08:25:15
【问题描述】:

我想阻止我的程序使用任何其他类型的输入而不是 int。如何检查输入的类型而不将其分配给变量?在C

【问题讨论】:

  • 你说的是什么形式的输入?从控制台输入?从文件输入?通过网络输入?

标签: c input int restriction


【解决方案1】:

strtodstrtol 和朋友。

所有这些函数都带有一个输出参数(通常称为endptr),它会显示转换结束的位置。您可以使用该信息来确定要转换的输入是整数还是浮点数,或者根本不是数字。

策略是尝试将输入解析为以 10 为底的长度。如果这不起作用(即如果有未转换的字符),请查看是否将其解析为双重工作。如果两者都不起作用,则输入不是数字。显然,您必须决定要对数字使用什么基本类型。您可以构建更多检查和改进,但这里是一个简单的示例。

#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;
}

【讨论】:

    【解决方案2】:

    你应该把它放到一个char变量(或一个字符串)中检查它的有效性,然后把它放到int var中。 您必须将数据读取到某个地方。

    【讨论】:

      【解决方案3】:

      如果不将输入分配给变量,您不可能这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 2012-12-02
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多