我不确定我的头衔应该是什么。但是,我试图对我的代码进行很好的验证。 以下是我的功能允许进入的唯一代码: 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'))
从上面的代码中可以看出,它太长了。知道如何缩短我的代码吗?谢谢!
答案 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
读取已处理字符的数量。如果处理了所有五个字符,则认为输入有效。
答案 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;
}