C语言中使用||逻辑运算符比较多个字符串无法正常运行怎么解决?
问题原因
你当前代码的逻辑运算符使用错误,核心问题出在if判断的条件逻辑上:
你写的判断条件是:
if ((strcmp("rock", game) != 0) || (strcmp("paper", game) != 0) || (strcmp("scissor", game) != 0))
这个条件的含义是只要输入不等于三个字符串中的任意一个,就判定为输入错误,而这个条件本身是恒成立的:
- 假设用户输入正确的
rock,那它必然不等于paper和scissor,因此(strcmp("paper", game) != 0)和(strcmp("scissor", game) != 0)都为真,逻辑或||只要有一个条件为真整个表达式就为真,因此会进入错误分支。 - 输入
paper或者scissor同理,必然满足和另外两个字符串不等的条件,最终都会触发错误提示。
修正方案
有两种符合需求的写法,你可以二选一:
方案1:修改逻辑运算符为&&
把原条件的逻辑或||替换为逻辑与&&,含义改为只有输入同时不等于三个字符串时,才判定为输入错误,符合你的需求:
if ((strcmp("rock", game) != 0) && (strcmp("paper", game) != 0) && (strcmp("scissor", game) != 0)) { printf("You entered a wrong input\n"); } else { /* 后续正常逻辑 */ }
方案2:正向判断合法输入
对初学者更直观的写法:先判断输入是否属于三个合法值中的任意一个,是就走正常逻辑,否则报错:
if (strcmp("rock", game) == 0 || strcmp("paper", game) == 0 || strcmp("scissor", game) == 0) { /* 后续正常逻辑 */ } else { printf("You entered a wrong input\n"); }
额外注意点
你代码里scanf("%s", &game);的写法不规范,数组名game本身就代表数组首地址,不需要加取地址符&,修改为scanf("%s", game);即可。
完整修正代码
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char game[40]; printf("Enter one among rock, paper and scissor: "); scanf("%s", game); for (int i = 0; game[i]; i++) { game[i] = tolower(game[i]); } // 这里用了方案2的正向判断,你也可以换成方案1的写法 if (strcmp("rock", game) == 0 || strcmp("paper", game) == 0 || strcmp("scissor", game) == 0) { /* Do Something */ } else { printf("You entered a wrong input\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Adrija Roy
相关产品推荐
相关产品推荐

