scanf("%c%c%c%c", &var1, &var2, &var3, &var4);
if ((var1 != 'f' || '+' || '-' || '[' || ']') ||
(var2 != 'f' || '+' || '-' || '[' || ']') ||
(var3 != 'f' || '+' || '-' || '[' || ']') ||
(var4 != 'f' || '+' || '-' || '[' || ']'))
printf("Invaild input\n");
这是我的代码,如果输入与任何chars不同,我希望用户输入4个变量,每个变量与要输出的输出之间要有空格。现在无论我在代码中输入什么,“无效输入”是输出。这里有什么问题吗?
答案 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>