在c中循环跳过

时间:2017-03-11 14:19:25

标签: c do-while

我还是c的初学者,我在这里做了一个do-while循环的麻烦。它第一次运行顺利,但在我再次尝试选择是。它会跳过scanf到目的地。只有当我输入乘客人数时,它才会继续。

#include <stdio.h>
#include <conio.h>
#include <windows.h>

char destination=' ';
int cash=' ';
int passenger=' ';
int multiply;
char again;
int change;
main(){
do{

printf("enter destination : \n");
printf("[Q] Quezon\n");
printf("[K] Kamuning\n");
printf("[A] Araneta Center Cubao\n");
printf("[G] Gilmore\n");
printf("[L] Legarda\n");
printf("[S] Santolan\n");

scanf("%c",&destination);
    int fare;

    switch(destination){
        case 'q':
        case 'Q':
            printf("Quezon city\n\n");
            fare = 11;

        break;
        case 'k':
        case 'K':
            printf("Kamuning\n\n");
            fare = 13;
        break;

        case 'a':
        case 'A':
            printf("Araneta Center Cubao\n\n");
            fare = 14;
        break;

        case 'G':
        case 'g':

            printf("Gilmore\n\n");
            fare = 16;
        break;

        case 'L':
        case 'l':

            printf("Legarda\n\n");
            fare = 20;
        break;

        case 's':
        case 'S':
            printf("Santolan\n\n");
            fare = 25;
        break;

    }



printf("Enter number of passenger\n");
scanf("%d",&passenger);

multiply = passenger*fare;

printf("\nTotal price: %d",multiply);

printf("\nEnter cash: ");
scanf("%d",&cash);
change=cash-multiply;

if(change<0){

printf ("\nchange: %d",change);
printf ("\nNot enough cash ");
}

else {
    printf ("\nchange: %d",change);
    printf ("\nSuccess");

}
printf("\n\n\nTry again? [y/n]: \n\n\n");
printf("---------------------------------------");
scanf("%s",&again);

}
while(again== 'Y' || again == 'y'|| change<0);
getch();

}

1 个答案:

答案 0 :(得分:1)

这是因为scanf()是一个可怕的功能!

在这种情况下,输入流中保留了'\n';当你再次执行scanf()时,它会消耗它并继续下一个。在第一次迭代后,您可以检查destination确实是'\n'

请注意scanf()设计得很好;它只是不直观,这就是为什么我说它太可怕了,因为它难以正确使用它。

大多数书籍教授使用scanf()进行输入,并且没有一本书解释它是如何完全工作的,或者如果你要使用它的话应该如何使用它。请阅读此scanf(3),但请仔细阅读。然后你会注意到scanf("%d", &value)而没有检查它返回的内容,这是完全错误的。