首页 > 解决方案 > 如何在 C 中检查字符串中的一系列字符串?

问题描述

我必须用 C 创建一个纸牌程序。我已经设置了数据结构,但我有一个关于比较字符串的问题。

用户输入必须看起来像“将 [color] [value] 移动到 [stack]”。

现在我的计划是用来strncmp查看字符串是否包含"move" "color"等。但是对于"value",我有 13 个可接受的输入范围(Ace 到 King),这意味着我需要 13 个不同的 if 语句. 有没有更优雅的方法来检查输入包含哪个“值”?

示例:“将红色 4 移至 3”或“将黑色 K 移至 6”

在确定用户指定的内容后,我必须在 7 个双链表中找到给定的卡片,并将其移动到用户指定的另一个列表中。

谢谢!

标签: cstringif-statement

解决方案


如果您的 value 输入是单个字符,您可以简单地检查该字符是否存在于有效字符列表中:

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
}

这种解决方案的好处在于代码的清晰度和可扩展性,而不是提高性能或减少总行数。为了获得最佳性能,我希望通过第一个字符的查找表(或简单的 a switch)然后手动逐字符验证(仅剩余的可能性)很难被击败。


推荐阅读