4

我在 C 中输入 char 时遇到问题。我希望用户只输入xor 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'));
}

当我输入xorX时,我不应该再次输入。

4

2 回答 2

3

您的 if 条件错误应该是:

if((temp!='x') && (temp!='X')) 
               ^  && if not both 

我替换||&&因为任何一个都被接受,所以如果 temp 不等于两者,则应打印条件错误消息

第二个while条件应该是:

while(!((temp =='x') || (temp=='X')));
      ^

正如你所说,当我输入 x 或 X 时,我不应该再次输入所以 if tempis xor Xthen (temp =='x') || (temp=='X')==1并且因为!它给出了while(0)循环中断

此外,您的结构定义应如下所示:

typedef struct {
    char c;
}chu;

我更正了您可以从这里找到的代码并在您的机器上尝试。

于 2013-03-31T10:40:02.597 回答
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 () 连接的任何内容都将停止计算truetrue在那一刻,无论如何,整个构造都会返回。

相反,只要&&第一个条件返回,您使用 AND ( ) 连接的任何内容都将停止评估,因为无论如何false它都会生成整个构造。false

回到你的例子,这就是你的编译器所做的,假设我们输入'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)。

于 2013-03-31T10:40:54.057 回答