我在C中输入字符时遇到问题。我希望用户只输入x
或X
。如果没有,用户必须再次输入。而且,我想用结构来做。这是我的代码:
typedef struct chu{
char c;
};
int main(){
chu input;
char temp;
do{
printf("\nInput: ");
temp=getche();
if((temp!='x')||(temp!='X'))
printf("\nWrong input (only 'x' or 'X')");
else
input.c=temp;
}while((temp!='x')||(temp!='X'));
}
当我输入x
或X
时,我不应该再次输入。
答案 0 :(得分:3)
你的if条件错误应该是:
if((temp!='x') && (temp!='X'))
^ && if not both
我将||
替换为&&
(因为任何一个都被接受了,所以如果temp不等于两者,那么条件错误的消息应该打印)
第二,条件应该是:
while(!((temp =='x') || (temp=='X')));
^
正如你所说当我输入x或X时,我不应再输入因此如果temp
是x
或X
,那么{{1 }} == (temp =='x') || (temp=='X')
由于1
,它会提供!
和循环中断
此外,您的结构定义应该是:
while(0)
我更正了您可以找到的代码from here并尝试使用您的计算机。
答案 1 :(得分:1)
问题在于你的情况:
} while((temp!='x')||(temp!='X'));
这意味着:重复,不等于'x'或'X'。 (这总是如此,因为它只能是一个或另一个。 将其替换为:
} while(temp != 'x' && temp != 'X');
重复,而不是'x'或'X'。
同样的问题出现在你的if
中(我似乎第一次忽略了这一点,我的不好)。
您的代码可能会像这样重建:
int main(){
chu input;
char temp;
while(true) {
printf("\nInput: ");
temp=getche();
if(temp != 'x' && temp != 'X')
printf("\nWrong input (only 'x' or 'X')");
else {
input.c=temp;
break;
}
}
}
此代码将永远循环(如while(true)
所示),但只要输入“x”或“X”,它就会将变量设置为结构,break
从循环中解脱出来
关于语义的一些信息:
当第一个条件返回||
时,通过OR(true
)连接的任何内容都将停止评估。在那一刻,整个构造将返回true
,无论如何。
相反,您与AND(&&
)连接的任何内容都会在第一个条件返回false
后立即停止评估,因为它无论如何都会生成整个构造false
。 p>
回到你的例子,这就是你的编译器所做的,假设我们输入'X'
if(temp != 'x') { //Okay, it's not 'x'. Let's try the next one.
if(temp != 'X') { //Oh wait, it IS X. I can't stop yet!
//Stop looping
} //This will be executed
}
//Loop me!
这就是&&
if(temp == 'x') { //Hmm...not 'x'.
if(temp == 'X') { //Oh wait! It IS 'X'.
//Stop looping //This gets executed.
}
}
//Loop me!
您可能已经注意到,我在这里将!=
更改为==
。我可以这样做,因为二进制算术。 NOT(x OR X)等于(NOT x AND NOT X)。