这是我的代码。
char ask_for_command(){
char letter;
printf("Command: ");
scanf(" %c", &letter);
while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){
printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
printf("Valid commands: a d w x\n");
scanf(" %c", &letter);
}
return letter;
}
while循环的工作原理如下。
while(letter != 'a'){}
但不是这样。
while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){}
任何人都可以向我解释原因吗?先谢谢你。
答案 0 :(得分:2)
您希望使用&&
代替||
进行比较。想一想:letter
始终不等于'a'
或不等于d
。如果你的信是a,它仍然不等于b,所以它不等于a或不等于b。你想要的是一个既不等于'a'
,也不等于'd'
,也不等等的字母。请注意,α和β都不是(α或β)不同的。
向letter
提供初始值(您不想要的值,例如'a'
)或使用do
- while
循环也是一个好主意像这样:
do {
printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
printf("Valid commands: a d w x\n");
scanf(" %c", &letter);
} while (letter != 'a' && letter != 'd' && letter != 'w' && letter != 'x');
或者,您可以将strchr
用于此目的:
while (strchr("adwx", letter) == NULL)
使用#include <string.h>
时,请不要忘记strchr
。
答案 1 :(得分:2)
我认为ask_for_command()
要求用户在a
,d
,w
和x
之间进行选择。
如果你写下来,它就不会工作:
while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x')
实际上,想象如果用户选择w
(例如)会发生什么:
letter != 'a' -> TRUE
letter != 'd' -> TRUE
letter != 'w' -> FALSE
letter != 'x' -> TRUE
因此,陈述是:
while (TRUE || TRUE || TRUE || FALSE || TRUE) # You will enter the loop
如果您选择a
,d
或x
而不是w
,则会发生同样的事情。
如果你写
,它就不会工作while(letter != 'a')
的确,如果用户输入w
,则语句为true
(w != a
),您将进入循环。
使用while
进行无限循环。只要用户没有提供有效的命令,你就把他留在里面:
char ask_for_command(){
// Valid commands
char commands[] = "awxd"
char letter;
printf("Command: ");
while (1) {
// You ask for the command
scanf(" %c", &letter);
// Is it a valid command? If so, we can return it
if (memchr(commands, letter, strlen(commands)) != NULL)
return letter;
// It looks like the command given was invalid!
printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
printf("Valid commands: a d w x\n");
}
}
编辑:使用memchr
,如评论中提到的FUZxxl。
答案 2 :(得分:1)
while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){
是一个永远不会结束的循环。您可能想要逻辑AND而不是逻辑OR。
在C中的AND用&&
表示
C中的OR用||
因此,您应该将代码修改为:
while(letter != 'a' && letter != 'd' && letter != 'w' && letter != 'x'){
这意味着WHILE letter
不是d
,NOR w
,NOR x
你原来的意思是:
虽然字母不是d
或不是x
或不是w
由于某些内容不能同时为d
,x
和w
,因此总是如此