使用C中的getche在struct中输入char?

时间:2013-03-31 10:38:30

标签: c

我在C中输入字符时遇到问题。我希望用户只输入xX。如果没有,用户必须再次输入。而且,我想用结构来做。这是我的代码:

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'));
}

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

2 个答案:

答案 0 :(得分:3)

你的if条件错误应该是:

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

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

第二,条件应该是:

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

正如你所说当我输入x或X时,我不应再输入因此如果tempxX,那么{{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)。