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