我必须用C语言创建一个纸牌程序。我已经建立了数据结构,但是我有一个比较字符串的问题。
用户输入必须看起来像“将[颜色] [值]移动到[堆栈]”。
现在,我的计划是使用strncmp
来查看字符串是否包含“移动” “颜色” ,依此类推,但是具有”值“ 我有13个可接受的输入范围(从A到King),这意味着我将需要13个不同的if语句。有没有更优雅的方法来检查输入包含哪个“值”?
示例:“将红色4移到3” 要么 “将黑色K移到6”
确定用户指定的内容后,我必须在7个双向链接列表中找到给定的卡,然后将其移动到用户指定的另一个列表中。
谢谢!
答案 0 :(得分:1)
如果您输入的值是单个字符,则只需检查该字符是否存在于有效字符列表中即可:
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
),然后再手动对每个字符进行字符验证(仅对剩余的可能性进行验证)。>