C 为什么while循环不起作用?

C 为什么while循环不起作用?,c,C,我不熟悉c语言,我的代码遇到了一些问题。。我必须制作一个程序来计算租车的价格,但是while循环不能正常工作。while条件上面的scanf是%s而不是%c,因为它不允许我在%c时给出一个字符。提前谢谢 int main(){ float skms, ekms, tkms, price; char catcode; int days; do{ printf("Selected rental program:\n"); scanf(

我不熟悉c语言,我的代码遇到了一些问题。。我必须制作一个程序来计算租车的价格,但是while循环不能正常工作。while条件上面的scanf是%s而不是%c,因为它不允许我在%c时给出一个字符。提前谢谢

int main(){
    float skms, ekms, tkms, price;
    char catcode;
    int days;

    do{
        printf("Selected rental program:\n");
        scanf("%c",&catcode);
        printf("Enter number of days:\n");
        scanf("%d",&days);
        printf("Starting kilometers display:\n");
        scanf("%f",&skms);
        printf("Kilometers display at end of rent:\n");
        scanf("%f",&ekms);
        tkms=(ekms/10)-(skms/10);
        switch(catcode){
                case'a':
                case'A':
                    price=ammountDueA(days, tkms);
                    printf("%.2f\n",price);
                    break;
                case'b':
                case'B':
                    price=ammountDueB(days, tkms);
                    printf("%.2f\n",price);
                    break;
                case'c':
                case'C':
                    price=ammountDueC(days, tkms);
                    printf("%.2f\n",price);
        }

        printf("Select rental program.('Q' or 'q' to exit)\n");



        scanf("%s",&catcode);


    }while(catcode==!'Q'&&catcode==!'q');
    printf("%c",catcode);


    return 0;
}

“不工作”,我想你的意思是它永远不会进入第二次迭代,但这正是它应该做的<代码>catcode==!'Q'&&catcode==!'如果
catcode
等于
,则q'
为真Q'并等于
!'q'
'Q'
是一些非零整数(取决于您的系统,但可能是81),并且
!'Q'
为零。类似地,
!'q'
为零
catcode
不是零,因此循环终止。

代码中有两个问题:

首先,
scanf
中的说明符

scanf("%s", &catcode);
这行不通。
“%s”
说明符期望其相应的参数是一个
char*
到一个未指定长度的缓冲区(即:它有)。您可能指的是
“%c”
,其相应的参数应指向单个字符。现在,不建议将格式说明符设置为
“%c”
,而应设置为
“%c”,因为额外的空间表示
scanf()
忽略它前面的所有空白。所以,这条线变成了

scanf(" %c", &catcode);
现在,您是对的,您的
while
循环中有一个问题:

while(catcode==!'Q'&&catcode==!'q');
让我们用空格来“扩展”它,使您(显然)想要的更明显(这就是为什么要在操作符之间使用空格!)

对你来说似乎没问题。不适合我。C语言没有定义任何操作符==
(用于比较相等性)和运算符
(对其单个操作数求反)。编译器会将该行理解为

while(catcode == !'Q' && catcode == !'q');
那是什么意思?如果操作数为非零,则
运算符返回零(在本例中为空字符,
'\0'
)。否则,它将返回一个非负值(通常为
1
(标准是否规定了这一点?)。因为
'Q'
不是
'\0'
,对于
'Q'
也是一样的,这意味着您的循环是有效的

while(catcode == '\0' && catcode == '\0'); // Think of '\0' as 0
代码中表示的绝对无意义!解决方法是简单地使用操作符
=(比较不平等性)


我希望这能给你带来一些启示

什么是
===操作员应该做什么?
catcode==!'Q'
应该是
catcode!='对于不等式表达式,您应该使用
=而不是
==。例如:
intx=0;如果(x!=10){/*TODO*/}
如果希望catcode是字符串,则将其声明为“char catcode[];”你的意思是做{}(while);。。。
while(catcode == '\0' && catcode == '\0'); // Think of '\0' as 0
while(catcode != 'Q' && catcode != 'q');