проверить мульти входной символ в с - PullRequest
0 голосов
/ 06 ноября 2018
scanf("%c%c%c%c", &var1, &var2, &var3, &var4);
if ((var1 != 'f' || '+' || '-' || '[' || ']') ||
        (var2 != 'f' || '+' || '-' || '[' || ']') ||
        (var3 != 'f' || '+' || '-' || '[' || ']') ||
        (var4 != 'f' || '+' || '-' || '[' || ']'))
        printf("Invaild input\n");

это мой код, я хочу, чтобы пользователь вводил 4 переменные с пробелом между каждой из них и выводом, который будет активирован, если вход отличается от любого из этих символов. Прямо сейчас, независимо от того, что я ввожу в код "неверно" вход "есть выход. здесь что-то не так?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

@ Стефан Лехнер хорошо определил проблемы с кодом ОП и хорошее решение. Ниже приведено альтернативное решение для проверки, является ли символ одним из нескольких символов за один шаг. Используйте справочную таблицу.

#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>
0 голосов
/ 06 ноября 2018

Основная причина, по которой он не работает, заключается в том, что ваши условия, такие как (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", который предназначен для использования пробелов перед фактическим символом.

...