检查C中的多输入字符

时间:2018-11-05 22:14:38

标签: c char

scanf("%c%c%c%c", &var1, &var2, &var3, &var4);
if ((var1 != 'f' || '+' || '-' || '[' || ']') ||
        (var2 != 'f' || '+' || '-' || '[' || ']') ||
        (var3 != 'f' || '+' || '-' || '[' || ']') ||
        (var4 != 'f' || '+' || '-' || '[' || ']'))
        printf("Invaild input\n");

这是我的代码,如果输入与任何chars不同,我希望用户输入4个变量,每个变量与要输出的输出之间要有空格。现在无论我在代码中输入什么,“无效输入”是输出。这里有什么问题吗?

2 个答案:

答案 0 :(得分:2)

之所以不起作用,主要是因为诸如(var1 != 'f' || '+' || '-' || '[' || ']')之类的条件所做的事情与您想象的完全不同。无论(anyBooleanValue || '+')的值是什么,类似true的表达式将始终返回anyBooleanValue。这是因为RHS操作数'+'是字符文字,即表示(很有可能)字符'+'的ASCII码的整数值。除了0以外的任何整数值都被视为true,因此其读为anyBooleanValue || true,这显然总是正确的。

因此,您实际上必须编写类似if (var1 != 'f' && var1 != '+' && ...的内容,如@WhozCraig所述。

但是实际上您一次又一次出现相同的代码,并且这种情况通常由循环处理。使用功能strchr可以轻松解决测试字符是否出现在一组可能的字符中的问题,该函数返回指向所讨论字符或NULL首次出现的指针(如果该字符不会发生。以下代码说明了这一点:

int main() {

#define nvars 4

    char vars[nvars];
    int i;
    for (i=0; i<4; i++) {
        scanf(" %c", &vars[i]);
        if (strchr("f+-[]",vars[i]) == NULL) {  // char not found?
            break;
        }
    }

    if (i<4) {
        printf("Invaild input\n");
    } else {
        printf("valid.\n");
    }
}

请进一步注意scanf(" %c"中的前导空格,该空格用于占用实际字符之前的空白。

答案 1 :(得分:0)

@Stephan Lechner很好地确定了OP的代码存在的问题和好的解决方案。下面是一种替代解决方案,可以一步一步检查一个字符是否是多个字符之一。使用查找表。

#include <stdio.h>
#include <stdbool.h>
#include <limits.h>

int mango_test(unsigned char ch) {
  // If char is not too big
#if UCHAR_MAX < 1024
  static const bool good[UCHAR_MAX + 1] = { //
      ['f'] = 1, ['+'] = 1, ['-'] = 1, ['['] = 1, [']'] = 1};  // look-up table
  return good[ch];
#else
  char *s = strchr("f+-[]", ch);
  return s && ch;  // Found in list and not the null character.
#endif
}

int main(void) {
  for (int ch = SCHAR_MIN; ch <= UCHAR_MAX; ch++) {
    int found = mango_test(ch);
    if (found)
      printf("Found %d <%c>\n", ch, ch);
  }
}

输出

Found 43 <+>
Found 45 <->
Found 91 <[>
Found 93 <]>
Found 102 <f>