Если ваш ввод для значения представляет собой один символ, вы можете просто проверить, существует ли этот символ в списке допустимых символов:
const char valid_values[] = "A23456789TJQK";
if (strchr(valid_values, input_value[0])) {
// valid
} else {
// invalid
}
Вы можете даже использовать сам символ как есть какпредставление значения (поскольку оно уникально и оптимально мало при 1 char
).Или вы можете преобразовать в числовое значение, взяв индекс (например, вычитая valid_values
из не- NULL
возвращаемого значения strchr
) и добавив 1
.
Если вы хотитеразрешить множественные альтернативы (такие как «A», «ace» или «two», «2», «deuce»), простая альтернатива - создать массив пар строк-значений и перебирать их, пока не будет найдено совпадение иликонец достигнут:
struct value_string {
const char *string;
int value;
};
const struct value_string valid_values[] = {
{ .string = "A", .value = 1 },
{ .string = "ace", .value = 1 },
{ .string = "2", .value = 2 },
{ .string = "two", .value = 2 },
// …
{ .string = "K", .value = 13 },
{ .string = NULL, .value = 0 } // terminator
};
int card_value = 0;
for (const struct value_string *p = valid_values; p->string; ++p) {
if (strcmp(p->string, input_value) == 0) {
// found match
card_value = p->value;
break;
}
}
if (card_value) {
// valid
} else {
// invalid
}
Преимущества такого рода решения заключаются в ясности и расширяемости кода, а не в улучшении производительности или уменьшении общего количества строк.Для лучшей производительности я бы ожидал, что справочную таблицу (или просто switch
) по первому символу, а затем ручную символьную проверку (только из оставшихся возможностей) будет трудно превзойти.