为什么while循环不起作用?

时间:2015-11-07 13:57:21

标签: 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",&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;
}

2 个答案:

答案 0 :(得分:1)

通过"不工作",我想你的意思是它永远不会进入第二次迭代,但这正是它应该做的事情。如果char *buffer = NULL; char* readFile(const char *path) { FILE *file; file = fopen(path, "r"); if (file == NULL) { perror(path); printf("Error: %d \n", errno); return "Error"; } //get size of file. fseek(file, 0, SEEK_END); size_t fileSize = ftell(file); //allocate sizeof file +1. char *buffer = (char *)malloc((fileSize +1) * sizeof(char)); //read file into string int c; int i = 0; while((c = fgetc(file)) != EOF) { buffer[i] = (char)c; ++i; } buffer[i] = '\0'; fclose(file); return buffer; } void freeMem(void) { free(buffer); } int main(void) { const char *path = "C:\\Programmering\\TestReader\\syntax\\file.txt"; char *cStr = readFile(path); //freeMem(); system("pause"); return 0; } 等于catcode==!'Q'&&catcode==!'q'且等于catcode,则!'Q'为真。 !'q'是一些非零整数(取决于您的系统,但可能是81),'Q'为零。同样,!'Q'为零。 !'q'不为零,因此循环终止。

答案 1 :(得分:1)

您的代码中存在两个问题:

首先,scanf ...

中的说明符
scanf("%s", &catcode);

这不会奏效。 "%s"说明符期望其对应的参数为char*到未指定长度的缓冲区(即:这有the same problem as gets())。您可能意味着"%c",其对应的参数应指向单个字符。现在,建议您的格式说明符不是"%c",而是" %c", because that extra space indicates scanf()to ignore all whitespace it can before"%c"`。那么,那条线就变成......

scanf(" %c", &catcode);

现在,你是对的,while循环中存在问题:

while(catcode==!'Q'&&catcode==!'q');

让我们"扩展"这有空白,使你(显然)意图更明显(这是#1在运营商之间使用空间的原因!)......

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

代码中表达的绝对无意义!解决方案是简单地使用运算符!=(比较不等式)......

while(catcode != 'Q' && catcode != 'q');

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