【问题标题】:Compare character with multiple characters in C将字符与C中的多个字符进行比较
【发布时间】:2015-06-24 21:40:11
【问题描述】:

如何在不使用“if”的情况下将 C 中的字符与其他字符进行比较 有大量的“||”? 例如,假设我有一个名为“i”的角色,我想将其与其他 8 个没有任何联系的角色进行比较,如果“i”至少等于这 8 个角色中的一个,则表达式为真。 像这样的:

if(i == c1 || i == c2 || i == c2 ........){ /* do stuff */}

但在大型应用程序中,这些比较很多,而不仅仅是 3 或 8。 有没有一种聪明而快速的方法来实现这样的事情,而不是最终得到丑陋的代码?提前谢谢你。

【问题讨论】:

  • 如果 i 是可变的,请删除那些''。还有c1是什么?
  • 您可以将c1,c2,,,,,,,cn变量存储在一个数组中。然后循环比较。
  • 使用switch 声明。
  • 所有变量都是字符@giorgi
  • @NafeeurRahman 谢谢!我试试看

标签: c if-statement character logical-operators


【解决方案1】:

假设您的 'c1', ... 只是一个 char 常量,您可以使用:

if ( strchr("12345", ch) != NULL )
    ...

("12345" 是c1, c2, ...)

strchr() 但是,也将匹配隐式尾随 NUL 终止符 ('\0')。如果这是一个问题,您可以显式地比较这个值。由于输入字符串是从头开始搜索的,因此您可能希望在开头使用更可靠的值。

注意strchr 确实返回了一个指向匹配字符的指针;只要你需要。

如果您可以对值进行分组,例如“字母”、“数字”等,看看ctype.h

如果值是变量,您可以在比较之前将它们复制到 char 数组中(不要忘记 trminator!)或将它们保存在数组中:@987654331 @ 是 c1, ... .

如果这一切都不可能,您很可能会被strcpy 打倒。你可以使用这个:

// assuming there are always the same variables used.
static const char * const ca[] = { &c1, &c2, ... };

char val;

for ( size_t i = 0 ; i < sizeof(ca) / sizeof(ca[0]) ; i++ ) {
    if ( *ca[i] == val ) {
        // match!
    }
}

你可以将它打包到一个函数中,并在这里和那里进行一些装饰。

【讨论】:

  • 我可以用 {c1, c2, c3, '\0'} 之类的东西代替“12345”吗?
  • 您可以使用任何字符串常量。检查复合文字。或以八进制或十六进制代码形式输入值:\x20。嗯...这些值实际上是变量吗?您的问题确实有所不同。
  • 是的,所有值都是变量,这就是为什么在不避免代码混乱的情况下很难做到这一点的原因。他们的名字也更大,不仅仅是“c1”或“i”。
  • @AnnoyingQuestions:请编辑您的问题 'c1' 实际上是一个字符文字(假设 c1 是单个字符)。但是,我更新了我的答案
  • 你也可以把他介绍给if (strchr ("12345", ch))自己,提点思路和学习:p
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 2020-04-15
  • 1970-01-01
  • 2021-03-04
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多