分解&&和||在C.

时间:2017-10-29 16:37:36

标签: c

我不确定我的头衔应该是什么。但是,我试图对我的代码进行很好的验证。 以下是我的功能允许进入的唯一代码: c0001,c0002,c0003,c0004,c0005,C0001,C0002,C0003,C0004,C0005。因此,除了这10个代码之外,它不应该接受它并继续向用户推销正确的代码。

if (strlen(meal_choice) == 5 && (meal_choice[0] == 'C' || meal_choice[0] =='c') && meal_choice[1] == '0' && meal_choice[2] == '0' && meal_choice[3] == '0' && (meal_choice[4] == '1' || meal_choice[4] == '2' || meal_choice[4] == '3' || meal_choice[4] == '4' || meal_choice[4] == '5'))

从上面的代码中可以看出,它太长了。知道如何缩短我的代码吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以检查某个字符是某个范围内的数字,您可以将该字符与该范围的端点与>==<进行比较,因为数字会被分配连续的代码:

... && meal_choice[4] >= '1' && meal_choice[4] <= '5'

您还可以使用sscanf基本的类似regex的功能进行验证,如下所示:

int res = -1;
sscanf(code, "%*[cC]000%*[1-5]%n",  &res);
if (res == 5) {
    ... // The code is valid
}

以上扫描并忽略格式化输入(注意百分号后的星号),并使用%n读取已处理字符的数量。如果处理了所有五个字符,则认为输入有效。

Demo.

答案 1 :(得分:1)

在我看来,这是最易读的代码,这是您应该追求的最重要的方面:

const char* valid_codes[] = {
    "c0001", "c0002", "c0003", "c0004", "c0005",
    "C0001", "C0002", "C0003", "C0004", "C0005"
};

const int valid_codes_size = sizeof(valid_codes) / sizeof(valid_codes[0]);

int is_valid_code(const char* code)
{
    for (int i = 0; i < valid_codes_size; ++i)
    {
        if (strcmp(code, valid_codes[i]) == 0)
            return 1;
    }
    return 0;
}