我还是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();
}
答案 0 :(得分:1)
这是因为scanf()
是一个可怕的功能!
在这种情况下,输入流中保留了'\n'
;当你再次执行scanf()
时,它会消耗它并继续下一个。在第一次迭代后,您可以检查destination
确实是'\n'
。
请注意scanf()
设计得很好;它只是不直观,这就是为什么我说它太可怕了,因为它难以正确使用它。
大多数书籍教授使用scanf()
进行输入,并且没有一本书解释它是如何完全工作的,或者如果你要使用它的话应该如何使用它。请阅读此scanf(3),但请仔细阅读。然后你会注意到scanf("%d", &value)
而没有检查它返回的内容,这是完全错误的。