【问题标题】:Do while loop skipping in c在c中执行while循环跳过
【发布时间】:2017-03-11 14:19:25
【问题描述】:

我仍然是 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();

}

【问题讨论】:

  • 请注意,'\n' 字符在正常情况下会刷新输出缓冲区,因此将其放在行尾而不是放在行尾更自然(或习惯)开始。
  • @xing,其实还需要一个scanf(" %c", &amp;destination);。我希望 OP 会阅读文档并自己解决这个问题。

标签: c do-while


【解决方案1】:

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

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

注意scanf() 设计得很好;它只是不直观,这就是为什么我说它很糟糕,因为正确使用它非常困难。

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

【讨论】:

  • scanf() 中的一些设计决策将根据经验进行更改。显着的设计更改将解决缓冲区长度的问题。如果您有char buffer[256];,则必须使用"%255s"(而不是"%256s")作为大小,而几乎在其他任何地方,您都使用缓冲区的大小,而不是比缓冲区的大小小一。并且应该有一些机制允许您动态指定大小,就像在printf() 中一样——但scanf() 抢占* 以抑制分配,因此很难与printf() 保持一致。这些问题无法修复。