c - 如何在 C 中检查字符串中的一系列字符串?
问题描述
我必须用 C 创建一个纸牌程序。我已经设置了数据结构,但我有一个关于比较字符串的问题。
用户输入必须看起来像“将 [color] [value] 移动到 [stack]”。
现在我的计划是用来strncmp
查看字符串是否包含"move" "color"等。但是对于"value",我有 13 个可接受的输入范围(Ace 到 King),这意味着我需要 13 个不同的 if 语句. 有没有更优雅的方法来检查输入包含哪个“值”?
示例:“将红色 4 移至 3”或“将黑色 K 移至 6”
在确定用户指定的内容后,我必须在 7 个双链表中找到给定的卡片,并将其移动到用户指定的另一个列表中。
谢谢!
解决方案
如果您的 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
)然后手动逐字符验证(仅剩余的可能性)很难被击败。
推荐阅读
- python - 如何在 Linux 中使用 ctime
- c - 如果 __STDC_IEC_559__ 未定义,那么如何确定 FP(至少部分)符合 IEEE 754?
- swift - 模拟器调试区没有位置选项
- python - Kafka-spark 流不适用于 Jupyter
- c# - 我想在 C# 的函数中打印一个随机数组(如果它不在函数中也可以)。我能怎么做?
- javascript - 网页在 javascript 关闭时错误地重新加载
- c# - 如何在不单击的情况下将子菜单 DropDownItem 设置为 CHECKED?
- python - 如何使相对或绝对导入起作用
- webpack - 来自 CDN 的 Webpack 外部,用于 UMD 应用程序
- docker - 从一个 docker-compose 托管 docker swarm,但使用节点 var